简介
Promise 是现代 JavaScript 中最常用的异步编程方式之一,它可以方便地解决回调地狱和并发请求等问题。在 ECMAScript 2018(ES9)中,Promise 新增了 catch() 方法来捕获错误,但是它只能处理 reject 状态下的情况。为了提高 Promise 的可读性和可维护性,ES12 引入了一个新的 API——finally()。
Promise.prototype.finally()方法允许你在Promise完成时执行代码,不管它是被 resolved 还是 rejected。并且它回传原本的 Promise 对象, 因此你可以将一个 finally 给定到链式调用所结尾处,使其控制每个状态转移。
使用方式
finally()方法需要一个函数作为参数,该函数会在当前 Promise 结束后执行。无论当前 Promise 执行结果如何,finally() 方法的回调函数都会被执行:
-- -------------------- ---- ------- ----------- ------------ -- - -- -- ------- -- -- ------------ -- - -- -- ------ -- -- ----------- -- - -- - ------- - ------- ----- ---
在上面的代码中,我们把 finally() 方法添加到 Promise 链式调用的末尾。无论 Promise 是成功地还是失败地执行,它都会在 Promise 结束后运行。
示例
我们可以使用 finally() 方法来关闭一个数据库连接或者停止一个计时器等。下面是一个使用 Promise.prototype.finally() 方法的示例代码:
-- -------------------- ---- ------- ----- ---------------- - -- -- --- ----------------- ------- -- - ------------- -- - ----- ------------ - ------------- - --- -- ------------- - -- - --------------- ------ - ---- - ---------------- ------ - -- ------ --- ------------------ ------------ -- -------------------- ------------ -- --------------------- ----------- -- -------------------- ------
在上述代码中,我们使用了 setTimeout() 模拟了一个异步操作。该操作将生成一个随机数,如果这个数字小于5,则返回一个 rejected 的 Promise,否则返回一个 resolved 的 Promise。在代码的末尾,我们使用了 finally() 方法来记录 Promise 结束后的事件。
以上代码的输出结果可能如下所示:
// 当 promise 成功时: Promise 成功了 Promise 结束 // 当 promise 失败时: Promise 失败了 Promise 结束
通过这个示例,我们不仅可以看到 finally() 方法的使用方式,而且还能理解其对 JavaScript 开发者的实用性。
总结
ES12 中引入的 Promise.prototype.finally() 是一项非常有趣的新特性,它允许我们在 Promise 被 settled(resolved 或 rejected)后执行代码块。使用 finally() 方法可以使代码更加简洁和易于阅读,同时也可以帮助我们避免“回调地狱”的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651bc13595b1f8cacd360659