Promise.prototype.finally 方法是在 ES11 中添加的,它允许我们在 Promise settled(不论是 fulfilled 还是 rejected)的时候执行某些操作,这样使得我们不必处理 settled 时执行操作的重复代码。在本文中,我们将详细讨论 Promise.prototype.finally 方法以及其使用技巧。
Promise.prototype.finally 方法
Promise.prototype.finally 方法在 Promise settled 后执行一些操作。它可以接受一个回调函数作为参数,这个回调函数不接受任何参数,只会返回 Promise.resolve(),以保证 Promise 链的继续执行,如下所示:
-- -------------------- ---- ------- ------- ------------ -- - -- -------- -- ------------ -- - -- -------- -- ----------- -- - -- ------- ------ ---
在上述代码示例中,finally()
方法是在 then()
和 catch()
方法之后调用的,这使它成为了一个后处理程序(post-processor),即使 promise
已经 settled,也会在其执行结束时被调用。
Promise.prototype.finally 方法示例
下面是一个示例,演示了如何使用 finally()
方法来处理 Promise,从而避免重复代码:
-- -------------------- ---- ------- -------- ------------ - ------ ---------- -------------- -- - ---------------- - ----- --- ----------- ------ ------- --------------------- - ---- - ------ ---------------- - -- ------------ -- ----------------------- ------- ----------- -- -------------------- ------- ----------- - --------------------------------------------------------
在上述例子中,我们定义了一个 getJSON()
方法,该方法通过使用 fetch()
对远程 JSON API 进行请求,并处理它返回的 Promise。finally()
方法在 Promise settled 之后被调用,不管它是 fulfilled 还是 rejected。这个方法最终输出消息 'getJSON Promise settled'。
Promise.prototype.finally 方法的使用技巧
以下是一些使用 finally()
方法的技巧:
1. 链式调用
finally()
可以作为链式调用的一部分,因此,它可以用于任何可链式调用的 API 中。例如,它可以用于 fetch()
的返回实例,以在请求发生错误或成功之后进行清理。
2. 操作的顺序
finally()
方法返回一个 Promise,并且始终在 settled 之后执行。因此,它应该与异步操作的顺序相匹配。例如,如果某个结果依赖于异步操作,应该在 then()
方法中进行。如果操作定义了在 settled 之后立即执行的操作,应该在 finally()
中完成。
3. 代码结构的简化
finally()
方法可以简化代码,因为它可以帮助我们避免遗留代码。我们可以在 finally()
方法中执行类似清理或记录的操作,从而减少我们为 settled 操作而遗留的代码。
结论
在本文中,我们对 ES11 中的 Promise.prototype.finally()
方法进行了详细讨论。我们了解了这个方法的使用以及一些技巧,例如链式调用、操作的顺序和代码结构的简化。通过使用 finally()
方法,我们可以减少 settled 后的重复代码,并更好地组织我们的代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674b6b95d657e1f70db24441