ES9 中的 Promise.prototype.finally() 详解

在 ES9 中,Promise 对象新增了一个非常实用的方法:Promise.prototype.finally()。它可以在 promise 结束时,无论是 resolve 还是 reject,都会执行一段指定的代码,非常适用于需要在 promise 结束后进行一些清理工作的场景。本文将详细介绍 Promise.prototype.finally() 的特殊之处,以及如何使用它。

特殊之处

1. 返回原 promise 对象

与其他 promise 方法不同,Promise.prototype.finally() 不会改变原 promise 对象的状态,而是返回一个新的 promise 对象。这意味着,无论是 resolve 还是 reject,都不会影响原 promise 对象的状态。这一点与 Promise.prototype.then()Promise.prototype.catch() 不同,它们会返回一个新的 promise 对象,并根据回调函数的返回值改变状态。

2. 不接收参数

Promise.prototype.finally() 不接收任何参数,它只是在 promise 结束时执行指定的代码。这意味着,无法在 finally 方法中访问原 promise 对象的值或状态。如果需要在 finally 方法中访问 promise 对象的值或状态,可以使用闭包或者在 promise 内部定义变量。

3. 无法阻止 reject

Promise.prototype.catch() 不同,Promise.prototype.finally() 无法阻止 promise 的 reject。即使在 finally 方法中抛出错误,promise 仍然会 reject。这意味着,如果需要阻止 reject,应该使用 Promise.prototype.catch()

使用方法

使用 Promise.prototype.finally() 非常简单,只需要在 promise 对象后面调用该方法,并传入一个回调函数即可。该回调函数会在 promise 结束时执行,无论是 resolve 还是 reject。

下面是一个示例代码:

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

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

在上面的示例代码中,我们定义了一个 fetchData 函数,它使用 fetch 方法获取一个 JSON 数据,并将其解析为 JavaScript 对象。在 then 方法之后,我们调用了 finally 方法,并传入一个回调函数,该回调函数会在 promise 结束时打印一条日志。

无论 fetch 方法是否成功,finally 方法都会执行,并打印一条日志。这非常适用于需要在 promise 结束后进行一些清理工作的场景,比如关闭数据库连接、释放资源等。

总结

Promise.prototype.finally() 是一个非常实用的方法,它可以在 promise 结束时执行指定的代码。它与其他 promise 方法不同,不会改变原 promise 对象的状态,并且无法阻止 reject。使用 Promise.prototype.finally() 非常简单,只需要在 promise 对象后面调用该方法,并传入一个回调函数即可。如果需要在 promise 结束后进行一些清理工作,可以考虑使用 Promise.prototype.finally()

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