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
回调中的第一个参数。