Promise
是在 JavaScript 中进行异步编程时非常常见的一种方式,而在 ES2020 中,我们迎来了 Promise.prototype.finally()
方法,它可以在一个 Promise 遇到 resolve 或 reject 后,不管 Promise 状态如何,都执行一次指定的回调方法。
用法
Promise.prototype.finally()
方法接受一个 callback 函数作为参数,并且该函数不接受任何参数。它可以在 Promise 执行之后的任何时候执行,无论 Promise 是成功还是失败。
示例代码:
// javascriptcn.com 代码示例 // Promise 成功时执行 finally 方法 Promise.resolve('hello world') .finally(() => { console.log('finally executed'); }) .then(result => { console.log(result); }); // Promise 失败时执行 finally 方法 Promise.reject(new Error('something went wrong')) .finally(() => { console.log('finally executed'); }) .catch(error => { console.log(error.message); });
输出:
finally executed hello world finally executed something went wrong
深入理解
Promise.prototype.finally()
方法主要用于在一个 Promise 进入结束状态后,执行一个回调函数。这个回调函数会在 Promise 的状态变为 settled(fulfilled 或 rejected)后被调用,不管 Promise 是成功还是失败都会执行,而且它不会修改 Promise 的状态或值。
在我们常规的开发中,可能需要动态地添加或者删除 loader,或者类似操作,或者需要更新或者修整组件的属性等等,但是在这些操作之前或之后,我们需要一些清理的操作,比如重置标志位、清空缓存等等。此时就可以用到 Promise.prototype.finally()
方法来执行相关的清理操作。
注意事项
需要注意的是,Promise.prototype.finally()
方法并不会返回一个新的 Promise,而是返回原来的 Promise。而且它不会处理回调方法返回的结果,而是直接执行回调方法,如果该方法抛出错误,则会被下一个 catch 块捕获到。
我们需要保证回调方法是一个纯函数,没有任何副作用和操作状态对象。否则会影响程序的可维护和可调试性。
总结
在 ES2020 中,Promise.prototype.finally() 方法是一个非常方便且常用的新特性。它可以帮助我们在对 Promise 进行状态处理时,方便地做出一些清理和相关操作。同时我们还需要注意一些回调函数的使用细节,以保证程序的稳定和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6527c8d87d4982a6eba607ef