ES9 中的 Promise.prototype.finally 方法详解

阅读时长 6 分钟读完

在 ES9(ECMAScript 2018)中,Promise 增加了一个新的方法 finally。这个方法可以在 Promise 结束时,无论是 resolve 还是 reject,都会被执行。本文将详细介绍 finally 方法的使用方法,以及它的深度和学习以及指导意义。

语法

finally 方法的语法如下:

其中,promise 是一个 Promise 对象,onFinally 是一个回调函数,它会在 Promise 结束时被调用,无论是 resolve 还是 reject。onFinally 函数不接收任何参数,它只会返回一个新的 Promise 对象,该对象的状态和值与原来的 Promise 对象保持一致。

示例

下面是一个简单的示例,展示了 finally 方法的基本用法:

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

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

在上面的示例中,我们创建了一个 Promise 对象,并在 1 秒钟后 resolve 它。然后,我们通过 then 方法处理 resolve 的结果,通过 catch 方法处理 reject 的结果,最后使用 finally 方法,无论 Promise 结束时的状态,都会输出一条信息。

深度和学习

1. finally 方法的返回值

finally 方法返回一个新的 Promise 对象,该对象的状态和值与原来的 Promise 对象保持一致。也就是说,如果原来的 Promise 对象是 resolve 状态,那么新的 Promise 对象也是 resolve 状态,并且它的值与原来的 Promise 对象的值相同;如果原来的 Promise 对象是 reject 状态,那么新的 Promise 对象也是 reject 状态,并且它的值与原来的 Promise 对象的值相同。

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

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

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

在上面的示例中,我们使用 finally 方法创建了一个新的 Promise 对象 newPromise,并在 then 方法中输出了它的结果。由于原来的 Promise 对象是 resolve 状态,所以 newPromise 也是 resolve 状态,并且它的值与原来的 Promise 对象的值相同。输出结果为:

2. finally 方法的链式调用

finally 方法可以与其他 Promise 方法一起链式调用,例如 then 方法和 catch 方法。在链式调用中,finally 方法总是最后被调用。

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

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

在上面的示例中,我们使用 finally 方法和 then 方法一起链式调用,输出结果为:

3. finally 方法的多次调用

finally 方法可以被多次调用,每次调用都会返回一个新的 Promise 对象。

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

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

在上面的示例中,我们多次调用 finally 方法,每次调用都会输出一条信息。输出结果为:

指导意义

finally 方法的出现,为 Promise 增加了一个重要的特性,使得开发者可以更加方便地处理 Promise 的结束状态。在实际开发中,我们可以使用 finally 方法来进行一些清理工作,例如关闭数据库连接、关闭文件句柄等等。此外,我们还可以使用 finally 方法来进行一些状态转换,例如将 Promise 转换为 Observable。

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

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

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

在上面的示例中,我们将 Promise 对象转换为 Observable,然后使用 finally 方法来输出一条信息。输出结果为:

结论

finally 方法是 ES9 中 Promise 的一个新方法,它可以在 Promise 结束时被调用,无论是 resolve 还是 reject。finally 方法的返回值是一个新的 Promise 对象,该对象的状态和值与原来的 Promise 对象保持一致。在实际开发中,我们可以使用 finally 方法来进行一些清理工作,或者将 Promise 转换为其他类型的对象。

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

纠错
反馈