在 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:
const p1 = Promise.resolve("成功啦"); const p2 = Promise.reject(new Error("出错啦")); Promise.allSettled([p1, p2]) .then((results) => { console.log(results); });
在上述示例代码中,我们将两个 Promise(p1 和 p2)在 Promise.allSettled()
中等待。无论 p1
成功还是 p2
失败,Promise.allSettled()
中的方法都可以处理它们。
在这种情况下,Promise.allSettled()
将返回以下结果:
[ {status: "fulfilled", value: "成功啦"}, {status: "rejected", reason: Error: 出错啦 at <anonymous>-2.js:4} ]
Promise.allSettled() 特性介绍
除了可以处理多个 Promise 还提供以下特性:
处理多个 Promise 的结果
使用 Promise.allSettled()
,我们可以处理多个 Promise 的结果。如:
-- -------------------- ---- ------- ----- -------- - - ------------------- ------------------- ------------------ -------------- -- ---------------------------- --------------- -- - --------------------- ---
上述示例中我们让三个 Promise settle,并将结果存储在 names 变量中。即使其中一个 Promise fail 了,我们仍然可以保持其结果不丢失。结果如下:
[ {status: "fulfilled", value: 1}, {status: "fulfilled", value: 2}, {status: "rejected", reason: Error: 出错啦 at <anonymous>-2.js:4} ]
检查所有 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