ES2020:如何正确使用 Promise.allSettled()

阅读时长 6 分钟读完

在 ES2020 中,一个新的方法 Promise.allSettled() 在 Promise API 中被引入。与 Promise.all 相比,Promise.allSettled() 可以让我们等待多个 Promise 都 settle(fulfill 或 reject),并且我们可以获得每个 Promise 的结果或错误信息。

Promise.allSettled() 简介

Promise.allSettled() 返回一个 Promise,该 Promise 在所有 Promise settle 时 resolve。当所有 Promise settle 后,该 Promise 的状态会根据传入的 Promise 根据如下规则处理:

  • 若所有 Promise 都 fulfill,则 resolve 态 Promise.allSettled() 会传入每个 Promise 的值组成的数组。
  • 若有 Promise reject,则 resolve 态 Promise.allSettled() (不论有多少 Promise 行为异常)会包含每个 Promise 结果的对象。

Promise.allSettled() 适用于我们需要等待多个异步操作结果的情况下,而且我们不想中途退出并希望尽可能多的获取 Promise 的状态数据。

Promise.allSettled() 使用

接下来让我们看一下如何使用 Promise.allSettled(),以处理多个 Promise。

在下面的代码示例中,我们将使用 Promise.allSettled() 等待一个 resolve 和一个 reject 的 Promise:

在上述示例代码中,我们将两个 Promise(p1 和 p2)在 Promise.allSettled() 中等待。无论 p1 成功还是 p2 失败,Promise.allSettled() 中的方法都可以处理它们。

在这种情况下,Promise.allSettled() 将返回以下结果:

Promise.allSettled() 特性介绍

除了可以处理多个 Promise 还提供以下特性:

处理多个 Promise 的结果

使用 Promise.allSettled(),我们可以处理多个 Promise 的结果。如:

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

上述示例中我们让三个 Promise settle,并将结果存储在 names 变量中。即使其中一个 Promise fail 了,我们仍然可以保持其结果不丢失。结果如下:

检查所有 Promises 是否完成

我们可以在一个包含多个 Promise 的数组中使用 Promise.allSettled()。在所有处理完成之前,我们可以轮询调用该方法。

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

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

在上述示例中,我们创建了一个包含三个 Promise 的数组并在 1 秒、2 秒和 3 秒延迟后将它们全部 settle。然后,我们在所有 Promise settle 后打印 "所有 Promise 均 settle 了"。

处理多个 Promise 的结果,而不考虑结果顺序或 Promise 顺序

我们可以在处理多个 Promise 的结果时,不考虑结果顺序或 Promise 顺序。我们只需确保从传递给 Promise.allSettled() 的数组中获取相同的 Promise 结果即可。

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

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

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

在此示例中,我们传递 words 数组给 Promise.allSettled()。在此过程中,我们打印每个 Promise 的值。即使我们的数组中 Promise 的顺序是不同的,我们仍然可以确保从这些 Promise 中获取相同的结果。

总结

在 ES2020 中,Promise.allSettled() 方法可以让我们轻松等待多个 Promise 结果 settle。该方法为我们提供了几个有趣的特性,使得处理多个 Promise 的结果变得更方便。我们建议在需要等待多个异步操作完成并且想要获得所有 Promise 的状态数据时使用该方法。

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

纠错
反馈