ECMAScript 2017 新特性:Promise.prototype.finally() 方法详解

阅读时长 5 分钟读完

在前端开发中,很多时候都需要进行异步编程,而 Promise 是一种非常流行的解决方案。ECMAScript 2017 引入了 Promise.prototype.finally() 方法,这个方法在 promise 执行结束时无论成功还是失败,可以让开发者在代码层面实现一些最终操作。

Promise.prototype.finally() 的作用

Promise.prototype.finally() 方法接受一个函数作为参数,在 Promise 状态为 fulfilled 或 rejected 时都会执行这个函数,而且无论 Promise 状态如何,finally() 方法的返回值都会是一个新的 Promise 对象。

这个新 Promise 对象的状态根据其他 Promise 对象的状态而定:

  • 如果前面的 Promise 对象为 fulfilled,则 finally() 方法返回的 Promise 对象的状态也为 fulfilled。
  • 如果前面的 Promise 对象为 rejected,则 finally() 方法返回的 Promise 对象的状态也为 rejected。
  • 如果 finally() 方法抛出异常或返回一个 rejected 状态的 Promise 对象,则新 Promise 对象的状态也为 rejected。

通过这个方法,我们可以实现一些不管 Promise 执行结果如何都要执行的最终操作,比如清除一些资源、关闭一些持久连接等。

Promise.prototype.finally() 的用法示例

我们来看一个使用 Promise.prototype.finally() 的实际例子:

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

在这个例子中,我们使用 fetch() 方法获取数据。如果 fetch() 成功获取了数据,我们会在 then() 方法中进行处理;如果获取失败,我们会在 catch() 方法中处理错误。

不管 fetch() 接口的执行结果如何,我们都需要在结束时执行一些清理操作,例如记录日志或关闭连接等,那么这个时候就可以使用 finally() 方法来实现。

再来看一个例子,这个例子演示如何使用 Promise.prototype.finally() 来关闭 WebSocket 连接:

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

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

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

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

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

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

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

当执行 ws.close() 方法时,WebSocket 连接就会被关闭,但是由于 WebSocket 的关闭是异步操作,因此我们需要在 WebSocket 连接关闭后才能进行一些清理工作。那么这个时候,我们可以使用 Promise.prototype.finally() 方法来实现:

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

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

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

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

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

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

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

在这个例子中,我们创建了一个 Promise 对象,使用 resolve() 方法来设置 Promise 对象的状态为 fulfilled。在 Promise 对象的 finally() 方法中,我们可以进行一些清理工作。

当 WebSocket 连接关闭后,onclose 事件会被触发,然后我们通过 resolve() 方法来将 Promise 对象的状态设置为 fulfilled。这个时候,Promise 相关的执行完成函数就会被执行,从而可以进行一些清理工作。

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

纠错
反馈

纠错反馈