了解 Promise.any() 用法
2021 年 6 月发布 ES2021 标准。ES2021 引入了 Promise.any() 方法。该方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例返回。
const p = Promise.any([p1, p2, p3]);
只要参数实例有一个变成 fulfilled 状态,包装实例就会变成 fulfilled 状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。
Promise.any() 跟 Promise.race() 方法很像,只有一点不同。
const p = Promise.race([p1, p2, p3]);
上面代码中,只要 p1、p2、p3 之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给 p 的回调函数。
Promise.any() 必须等到所有参数 p1、p2、p3 变成 rejected 状态才会结束。
const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
console.log(first);
} catch (error) {
console.log(error);
}
上面代码中,Promise.any() 方法的参数数组包含三个 Promise 操作。其中只要有一个变成fulfilled,Promise.any() 返回的 Promise 对象就变成 fulfilled。如果所有三个操作都变成rejected,那么 await 命令就会抛出错误。
Promise.any() 抛出的错误,不是一个一般的 Error 错误对象,而是一个 AggregateError 实例。它相当于一个数组,每个成员对应一个被 rejected 的操作所抛出的错误。下面是 AggregateError 的实现示例。
// new AggregateError() extends Array
const err = new AggregateError();
err.push(new Error("first error"));
err.push(new Error("second error"));
// ...
throw err;
Promise.all() 方法只适合所有异步操作都成功的情况,如果有一个操作失败,就无法满足要求。
ES2020 引入了Promise.allSettled() 方法,用来确定一组异步操作是否都结束了(不管成功或失败)。所以,它的名字叫做”Settled“,包含了”fulfilled“和”rejected“两种情况。