ECMAScript 2018 中关于 Promise.prototype.finally() 的一些重要事项

阅读时长 4 分钟读完

介绍

Promise.prototype.finally() 是 ECMAScript 2018 中新增的方法,它可以在 Promise 的状态发生变化之后,无论是 resolve 还是 reject,都会执行相应的代码。Promise.prototype.finally() 可以用于处理一些资源释放、清理的场合,以及代码的统一处理等等。

使用方式

Promise.prototype.finally() 方法接收一个函数作为参数,当 Promise 实例状态改变时,该函数会被调用。无论 Promise 实例是 resolve 还是 reject,都会执行相应的代码。

例如:

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

上述代码输出:

注意事项

1. finally() 方法返回一个新的 Promise 对象

注意到 finally() 方法返回的是一个新的 Promise 实例,一旦 finally() 方法被调用,它会在原有的 Promise 对象之后再返回一个新的 Promise 对象,并且这个新的 Promise 对象的状态是原有的 Promise 对象的状态。

例如:

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

上述代码输出:

2. finally() 方法不能改变 Promise 的状态

finally() 方法只是 Promise 状态发生改变后,做一些资源释放、清理的工作,但并不能改变 Promise 对象本身的状态。

例如:

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

上述代码输出:

可以看到,Promise 状态没有从 resolve 改变成 reject,而是执行了 finally() 方法中的代码之后,返回了一个新的 Promise 对象,使得 Promise 状态变成了 reject。

3. finally() 方法可以省略参数

finally() 方法可以省略参数,这种情况下,它只是简单地将 Promise 对象的状态传递给下一个 Promise 实例。

例如:

上述代码输出:

总结

ECMAScript 2018 的 Promise.prototype.finally() 方法可以在 Promise 对象状态改变之后做一些资源释放、清理的工作,并且返回一个新的 Promise 对象。但 finally() 方法本身不会改变 Promise 对象的状态,同时 finally() 方法也可以省略参数。如果我们在 Promise 对象的处理流程中需要做一些资源释放、清理等工作,可以使用 Promise.prototype.finally() 方法,使代码更加简洁和易于阅读。

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

纠错
反馈