在 ES11 中,新增了 Promise.allSettled() 方法,该方法可以处理多个 Promise 实例,无论 Promise 实例是被 resolved 还是 rejected。在这篇文章中,我们将通过深入学习 Promise.allSettled() 方法来了解它的作用及如何使用它。
Promise.allSettled() 方法是什么?
Promise.allSettled() 方法会返回一个 Promise 实例,该实例会在所有 Promise 实例状态已经 settled 后被 resolved,Promise.allSettled() 方法返回的结果数组中的每个元素都代表了一个传递给 Promise.allSettled() 方法的 Promise 实例。每个元素都包含了该 Promise 实例的状态及其所返回的值(如果状态为 resolved),或者是产生的错误(如果状态为 rejected)。因此,即使其中某些 Promise 实例出现了错误,该方法也会等待所有的 Promise 实例状态已经 settled 后才会返回。
Promise.allSettled() 方法的使用
在使用 Promise.allSettled() 方法时,我们需要将需要处理的 Promise 实例放在一个数组中并传递给 Promise.allSettled() 方法。这个数组中每个元素都必须是一个 Promise 实例,Promise.allSettled() 方法会等待所有 Promise 实例状态已经 settled 后返回一个 Promise 实例,该实例的状态和值将取决于所有 Promise 实例的状态。
下面是一个简单的示例代码,它使用 Promise.allSettled() 方法来处理多个 Promise 实例:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - -- ----------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- -------------- - -- ------------ -- ------ --- ----------------------------- ------------------------- -- - --------------------- ---
在这个示例中,我们创建了两个 Promise 实例:promise1 和 promise2。promise1 已经被 resolved,而 promise2 被 rejected。之后,我们将这两个 Promise 实例传递给 Promise.allSettled() 方法,并使用 then() 方法来处理其返回结果。由于 promise1 和 promise2 的状态都已经 settled,所以 Promise.allSettled() 方法会立即返回一个 Promise 实例,该实例的状态是 resolved。
Promise.allSettled() 方法返回的结果如下所示:
[ { status: "fulfilled", value: "Promise 1 is resolved" }, { status: "rejected", reason: Error: Promise 2 is rejected at <anonymous>:8:17 } ]
在结果数组中,第一个元素的状态是 fulfilled,表示 promise1 已经成功被解决,其值为“Promise 1 is resolved”,而第二个元素的状态为 rejected,表示 promise2 已经被拒绝,其原因为“Promise 2 is rejected”。
Promise.allSettled() 方法的优点
Promise.allSettled() 方法与 Promise.all() 方法相比有一个主要的优点,它可以处理多个 Promise 实例,即使其中某些 Promise 实例被 rejected,该方法也会等待所有 Promise 实例状态已经 settled 后才会返回。而 Promise.all() 方法则在其中任何一个 Promise 实例被 rejected 时就会立即返回。
考虑下面的示例代码,该代码演示了 Promise.all() 方法在其中一个 Promise 实例被 rejected 时如何立即返回:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------------- - -- ----------- -- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- - ---------- -------------- - -- ------------ -- ------ --- ---------------------- ------------------------- -- - --------------------- ---------------- -- - ------------------- ---
在这个示例中,我们创建了两个 Promise 实例,promise3 和 promise4。promise3 被 resolved,而 promise4 被 rejected。我们将这两个 Promise 实例传递给 Promise.all() 方法并使用 then() 方法来处理其返回结果。由于 promise4 被 rejected,Promise.all() 方法会立即返回,并让我们进入 catch() 方法中。
在这种情况下,Promise.allSettled() 方法可能是更好的选择,因为它可以处理包含失败的 Promise 实例的情况,并且如果其中一个 Promise 实例被 rejected,它不会立即返回。
结论
在本文中,我们深入学习了 ES11 中的新特性 Promise.allSettled() 方法,并了解了它的作用及如何使用它。该方法可以处理多个 Promise 实例,并且即使其中某些 Promise 实例出现了错误,该方法也会等待所有的 Promise 实例状态已经 settled 后才会返回。在处理多个 Promise 实例时,Promise.allSettled() 方法可以是更好的选择,因为它可以处理包含失败的 Promise 实例的情况,并且不会立即返回。现在,你可以使用 Promise.allSettled() 方法更有效的处理多个 Promise 实例了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676f8072e9a7045d0d73b332