ES8 之 promise 的静态方法 finally 解析

阅读时长 5 分钟读完

在 ES8 中,Promise 的静态方法新增了 finally 方法,该方法可以在一个 Promise 完成、拒绝后,无论结果如何,都会执行一段代码。这对于最终清理工作和避免重复代码非常有用。本文将详细解析 finally 方法的使用方法和指导意义。

finally 方法介绍

finally 方法是 Promise 构造函数的一个静态方法,它接受一个函数作为参数,在 Promise 完成或拒绝后被调用,无论 Promise 最终的状态如何。这个函数不接受参数。

以下是 finally 方法的语法:

finally 方法的作用

finally 方法可以在 Promise 执行完毕后执行一段代码。无论 Promise 是 resolved 还是 rejected,这个处理程序都会被调用一次,以执行在 Promise 结束后的收尾工作,例如清理资源、更新 UI 界面等。

当我们在处理 Promise 链时,可能需要在其中某个步骤时进行一些清理工作。比如,在将结果展示给用户之前需要关闭一些资源,如果 Promise 链在后面还有其它操作需要执行,则需要在这些操作执行之前关闭资源。使用 finally 方法可以简单地将这些清理操作封装在一起,以便在 Promise 执行完毕时自动清理。

finally 方法的返回值

finally 方法返回一个 Promise 对象,原始 Promise 对象的值不会受到影响。通常,final 功能处理程序不会返回任何值,但是如果处理程序返回一个 Promise,则会等待该 Promise 结束后再继续执行。

在以下示例中,promise2 不会接收到任何值:

在以下示例中,promise2 将接收到 resolved 的值:

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

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

-------------------- -- -
  -------------------- -- ----
---
展开代码

finally 方法的正确使用方式

在实践中使用 finally 方法需要注意一些细节。以下是一些示例用法。

清理工作

在资源释放方面,finally 方法是非常有用的。例如,当我们使用 fetch 函数进行 AJAX 调用时,我们需要确保在得到响应对象并处理它之后,关闭 response 对象以释放资源。我们可以使用 finally 方法来清除这个对象:

合并 finally

在 promise 链中,可能会有多个 finally 方法,如果它们的处理程序相同,则可以使用 Promise.prototype.finally() 方法来避免重复。使用此方法可以将 finally 方法添加到一个 Promise 链的末尾,将它们合并到一个处理程序中:

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

--------------------- -- -
  ------------------
-- -- -- -
  ------------------
---
展开代码

异常处理

finally 方法不会改变 Promise 对象的状态或值,但在代码中使用 finally 方法时,需要注意代码缩进。如果 finally 方法中抛出了异常,则可能会中断代码的执行。因此,在确保最后一定会返回 Promise 对象之前,请小心检查代码:

-- -------------------- ---- -------
--- ----------------- ------- -- -
  --- -
    ----- --- ------------
  - ----- --- -
    ----------
  -
--
  ----------- -- -
    -------------------------
    ----- --- -------- ------- ---------
  --
  -------- -- --------------------------
展开代码

在这个示例中,finally 方法中发生了一个错误,但在 .catch() 中捕获了这个错误并正确地处理了。当然,在生产代码中,可能会有更复杂的处理方式。

迁移到 ES8 的建议

如果您想开始使用 ES8 中的静态 finally 方法,请注意以下提示:

  • 检查您的 JavaScript 引擎是否支持 ES8。
  • 检查您的代码是否需要支持较早的浏览器。在这种情况下,您需要使用 transpiler 或 Babel 转换器等工具。
  • 如果您仅需要 finally 方法,最好使用 es6-promise 库中的 polyfill。

结论

ES8 中引入的 finally 方法是 Promise 构造函数的一个静态方法,用于在 Promise 完成或拒绝后执行回调函数。此外,finally 方法返回的 Promise 对象将不受影响,并且根据原始 Promise 对象的状态接收相应的解决或拒绝值。

finally 方法为您提供了在 Promise 执行结束后执行收尾操作的可能性,有助于代码的简化和代码复用。同时,在使用 finally 方法时,需要注意这个方法的正确使用方式,尤其是资源释放和异常处理。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6720c56a2e7021665e040643

纠错
反馈

纠错反馈