ECMAScript 2020 (ES11) 中的 Promise.allSettled 详解

在 ECMAScript 2020 (ES11) 中,Promise.allSettled 是一个新增的 Promise 静态方法。它可以接收一个 Promise 数组作为参数,并返回一个 Promise 对象。当所有的 Promise 都被解决时,Promise.allSettled 的返回值会是一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。

Promise.all 和 Promise.race 的问题

在 ES6 中,Promise.all 和 Promise.race 是两个常用的 Promise 静态方法。Promise.all 接收一个 Promise 数组作为参数,当所有的 Promise 都被解决时,Promise.all 的返回值会是一个数组,数组中的每个元素都是对应的 Promise 的解决值。而 Promise.race 接收一个 Promise 数组作为参数,当有一个 Promise 被解决时,Promise.race 的返回值就是这个 Promise 的解决值。

然而,当 Promise 数组中存在一个 Promise 被拒绝时,Promise.all 和 Promise.race 都会立即抛出一个错误,导致 Promise 链的中断。这就使得 Promise.all 和 Promise.race 并不适用于一些场景,例如在多个 Promise 中同时发起请求,但希望即使其中某个请求失败,其他请求也能够继续进行。

Promise.allSettled 的解决方案

Promise.allSettled 的作用就是解决 Promise.all 和 Promise.race 的问题。它会等待所有的 Promise 都被解决,不管是被解决还是被拒绝,都会返回一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。这个对象包含两个属性:

  • status:表示 Promise 的状态,有两种可能的值,分别是 fulfilled 和 rejected。
  • value:表示 Promise 的解决值或拒绝原因。

下面是 Promise.allSettled 的语法:

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

其中 iterable 是一个可迭代对象,例如数组或类数组对象。

下面是一个使用 Promise.allSettled 的示例代码:

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

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

上面的代码中,Promise.allSettled 接收一个包含三个 Promise 的数组作为参数,其中第二个 Promise 被拒绝。当所有的 Promise 都被解决后,Promise.allSettled 的返回值是一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。在本例中,返回值如下:

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

可以看到,返回值是一个包含三个元素的数组,每个元素都是一个对象,表示对应的 Promise 的状态。第一个和第三个 Promise 被解决了,状态为 fulfilled,而第二个 Promise 被拒绝了,状态为 rejected,同时 reason 属性包含了拒绝的原因。

总结

Promise.allSettled 是一个非常有用的 Promise 静态方法,可以解决 Promise.all 和 Promise.race 的问题。它会等待所有的 Promise 都被解决,不管是被解决还是被拒绝,都会返回一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。在实际开发中,我们可以使用 Promise.allSettled 来处理多个异步操作,即使其中一个操作失败,也不会影响其他操作的结果。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65d00b16add4f0e0ff91f13d