使用 ES9 Promise.prototype.finally 总结异步操作

阅读时长 5 分钟读完

在前端领域,异步操作是不可避免的。我们通常使用 Promise 来管理异步流程,其中 then() 和 catch() 方法让我们能够处理异步操作的结果和错误。但有时,我们需要在不管 Promise 最终成功还是失败的情况下,执行一些清理操作。这就是 ES9 引入 Promise.prototype.finally 方法的原因。

Promise.prototype.finally 基本用法

Promise.prototype.finally 方法接受一个回调函数,该回调函数无论 Promise 最终结果如何都会被执行。我们可以使用它来释放资源、关闭数据库连接、清除定时器等。

下面是一个基本例子:

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

在这个例子中,不管请求成功还是失败,请求完成后都会执行 finally() 回调函数,打印 "request completed"。

Promise.prototype.finally 实现原理

Promise.prototype.finally 方法返回一个新的 Promise,该 Promise 的状态和原始 Promise 的状态相同。我们可以向 finally() 传递一个回调函数,然后使用 return 返回一个新的 Promise。在该回调函数内部,可以进行清理操作或者对结果进行处理。

在这个包含原理的例子中,我们首先使用 then() 方法处理 Promise 的结果或错误;接着,将 finally() 附加到该 Promise 的方式类似于 then()。finally() 返回一个新的 Promise,该 Promise 包装了原始 Promise,并在 finally 语句块中执行回调函数。

Promise.prototype.finally 最佳实践

有几种最佳实践可以帮助我们更好地使用 Promise.prototype.finally 方法。

1. Promise.prototype.finally 的相关用例

一个很棒的 Promise.prototype.finally 的使用情景是在 Promise 列表中顺序执行一系列请求,然后清理数据并启用 UI 元素。

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

这个例子中,我们使用 Promise.all() 方法来等待多个请求完成。在处理完结果或捕获错误后,我们在 finally() 方法中进行清理操作。

2. 避免 promise 链中冗余代码

有时候,我们需要在 promise 链中执行某些代码,但我们不关心该代码的成功或失败,而是想在任何情况下都执行它。在这种情况下,使用 finally() 而不是将该代码添加到每个 then() 块中要简单得多。

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

在这个例子中,我们使用了 finally() 方法来避免在每个 then() 块中添加冗余代码。

结论

使用 Promise.prototype.finally 方法能够让我们更好地管理异步流程。它不仅能让我们在不管 Promise 成功还是失败的情况下都执行清理操作,还能帮助我们避免冗余代码和提高代码简洁性。在编写自己的异步操作代码时,不妨尝试一下使用 finally(),以便更好地管理异步流程。

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

纠错
反馈