理解 ECMAScript 2017 的 Promise.prototype.finally() 方法

Promise.prototype.finally() 方法是 ECMAScript 2017 新增的方法,它可以被应用于 promise 实例,以在 promise 被 resolved 或 rejected 时做一些必要的清除或处理操作。在本文中,我们将深入探讨这个方法的语法、行为和使用场景,并提供相应的示例代码和实际应用建议。

语法

Promise.prototype.finally() 方法的语法如下:

--------------------------

其中,promise 代表需要应用这个方法的 promise 实例,onFinally 是一个回调函数,当 promise 被 resolved 或 rejected 时都会调用该函数。onFinally 函数的返回值不会影响 promise 实例本身的状态,也就是说,它不会像 then()catch() 方法那样返回新的 promise 实例。

行为

Promise.prototype.finally() 方法只有在 promise 被 resolved 或 rejected 时才会被调用,其行为类似于 try-catch-finally 语句中的 finally 子句。这意味着在 promise 被 resolved 或 rejected 前,onFinally 函数不会被执行;而在 promise 被 resolved 或 rejected 后,无论 onFinally 函数的执行结果如何,都不会影响 promise 实例的状态。

如果 onFinally 函数抛出异常,该异常只会被记录在控制台上,不会影响 promise 实例本身的状态。这意味着,即使 onFinally 函数执行失败,promise 实例的状态也不会变为 rejected。

使用场景

Promise.prototype.finally() 方法通常用于在 promise 被 resolved 或 rejected 后进行一些必要的清理操作,例如关闭连接、释放资源、清除计时器等。如果使用 then()catch() 方法来实现这些操作,可能会出现代码重复或忘记清理的问题。

下面是一个 fetch() 方法的示例,演示了如何使用 Promise.prototype.finally() 方法来关闭连接和显示加载状态:

-------- -------------- -
  ----- ------ - ---------------------------------
  ---------------- - ------------

  ------ ----------
    -------------- -- -
      -- -------------- -
        ----- --- -------------- -------- --- --- ----
      -
      ------ ---------------
    --
    ----------- -- -
      ---------------- - --
      ----------------------- --------
    --
-

在这个示例中,我们使用 fetch() 方法获取数据,并在开始请求时显示加载状态,结束时关闭连接和清除状态。这个示例还使用了 throw 语句来处理网络请求错误,并在 promise 被 resolved 或 rejected 时关闭连接。

注意事项

虽然 Promise.prototype.finally() 方法很方便,但我们还是需要注意一些事项来确保代码的健壮性和可读性:

  • finally() 方法不会创建新的 promise 实例,因此无法像 then()catch() 方法那样返回新的 promise 实例。如果需要返回新的 promise 实例,请在 finally 之前调用 then()catch() 方法。
  • finally() 方法不接受参数,并且无法修改 promise 实例的状态。如果需要修改状态,请使用 resolve()reject() 方法。
  • finally() 方法仅在 promise 被 resolved 或 rejected 时才会被调用。如果需要在 promise 被 pending 时执行某些操作,请考虑使用 then()catch() 方法。
  • finally() 方法只是一个语法糖,它可以用其他方式来实现相同的效果。如果你觉得使用 finally() 方法造成了代码混乱或难以维护,请考虑其他实现方法。

结论

Promise.prototype.finally() 方法是 ECMAScript 2017 新增的方法,它可以被应用于 promise 实例,以在 promise 被 resolved 或 rejected 时做一些必要的清除或处理操作。 在本文中,我们深入探讨了该方法的语法、行为和使用场景,并提供了相应的示例代码和实际应用建议。我们希望读者能够理解并掌握该方法的使用方法,以增强代码质量和可读性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67395f59317fbffedf16765b