Promise.allSettled

JavaScript

Promise.allSettled 已经在 Chrome 76 中上线了。

一个简单的例子:

const promises = [
  Promise.resolve('fulfilled'),
  Promise.reject('rejected'),
];

Promise.allSettled(promises)
  .then((result) => {
    /**
     * output:
     * [
     *   { status: 'fulfilled', value: 'fulfilled' },
     *   { status: 'rejected', reason: 'rejected' },
     * ]
     */
    console.log(result);
  });

只有所有数组中的 Promise 的结果不再是 pending.allSettled 才会返回结果。

.all.race 两个 API 最大的区别在于,.allSettled 不会提前结束。.all 会在任意一个 Promise reject 的时候失败,而 .race 则会在任意一个 Promise fulfilled 的时候成功。.allSettled 会等到所有结果都出来之后,再如实返回(以 fulfilled 的状态)。

需要注意的是,返回的结果是一个数组,其中的每一个元素都是一个对象。其中,每个对象都有 status 的字段,表示对应的 Promise 最终的结果是 fulfilled 还是 rejected。如果是 fulfilled 状态,那么对象会有 value 字段,值相当于 .then 回调中的第一个参数;如果是 rejected 状态,那么对象会有 reason 字段,值相当于 .catch 回调中的第一个参数。