ES9 中的 Promise.prototype.finally() 方法使用及注意点

阅读时长 4 分钟读完

Promise.prototype.finally() 是在 ES2018 引入的新方法,它允许你在 Promise 对象 fulfilled 或 rejected 后,无论如何最终都会执行一个回调函数。这个方法将会返回一个新的 Promise 对象,可以被链式调用。在本文中,我们将会介绍 Promise.prototype.finally() 方法的使用方法、注意点以及它在实际中的作用。

使用方法

Promise.prototype.finally() 方法只接受一个回调函数参数,这个参数可以是任何合法的推迟执行逻辑代码的函数。无论 Promise 状态是成功还是失败,这个回调函数都将被执行,而且该函数没有参数,也不能改变 Promise 即将返回的值。

下面是一个简单的例子:

此例子将会在 fetch 请求结束后,执行 console.log('请求结束') 语句。不管 Promise 是成功还是失败,最重要的是无论如何都将会执行该示例中的回调函数。

注意点

使用 Promise.prototype.finally() 方法有几个注意点需要我们注意:

返回一个新 Promise

这个方法返回一个新的 Promise 对象,不同于 Promise.prototype.then() 或 Promise.prototype.catch() 可以改变 Promise 的状态和值,Promise.prototype.finally() 只能返回一个新的 Promise 对象,且它不会触发任何进一步的操作。

无数据返回

Promise.prototype.finally() 方法将不会对 Promise 的结果进行操作,它仅仅是推迟执行一个操作,并返回一个新的 Promise 对象。所以,这个方法是不会返回一些数据的。如果您需要获取 Promise 对象中的返回数据,您仍然需要在 .then() 或 .catch() 方法中处理。

不负责前置条件

Promise.prototype.finally() 方法并不关心前置条件是否满足,即它不在乎前置条件是否已经完成。如果您需要在传入的回调函数执行之前判断一些条件是否成立,您需要在回调函数内部进行判断。

实际作用

Promise.prototype.finally() 方法是一个很有用的方法,它提供了一个一致的方式在一个 Promise 结束之后执行某些逻辑。尤其是在处理异步操作,需要做一些相应的增强逻辑时,这个方法可以避免我们重复书写代码。

下面是一个例子,假设我们有一个需要上传图片的函数,并且需要在上传结束后隐藏一个 loading 遮罩层:

上述代码可以很直观地看出,不论是请求成功还是失败,loading 元素都将被隐藏。Promise.prototype.finally() 的使用使我们可以在所有异步操作结束后,更新时变量或者执行一些相关操作。

结论

Promise.prototype.finally() 方法是一个非常方便的语法糖。虽然它只是推迟执行单个操作,不做其他操作,但它对处理异步操作代码提供了更加轻松和简单的方式。它不仅可以处理 Promise 函数中出现的错误,而且也能够对 Promise 中的数据进行注入,从而使开发人员的代码更加可读。

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

纠错
反馈