Promise.any() 和 AggregateError


# Promise.any() 和 AggregateError

Promise.any() 接收一个 Promise 可迭代对象,只要其中的一个 promise 提前成功,就直接返回那个已经成功的 promise。

如果可迭代对象中没有一个 promise 成功(即所有的 promise 都失败/拒绝),就返回一个失败的 promise 和 AggregateError 类型的实例(它是 Error 的一个子类,用于把单一的错误集合在一起)。

本质上,这个方法和 Promise.all() 是相反的。

# 举例演示

const p1 = new Promise((resolve, reject) => {
  setTimeout(
    () => resolve("promise one"),
    Math.floor(Math.random() * 100)
  );
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(
    () => resolve("promise two"),
    Math.floor(Math.random() * 100)
  );
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(
    () => resolve("promise three"),
    Math.floor(Math.random() * 100)
  );
});

(async function() {
  const result = await Promise.any([p1, p2, p3]);
  console.log(result); 
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

上述代码可以随机输出 promise onepromise twopromise three

如果将上述代码改成所有的都 reject,那么会抛出 AggregateError:

const p1 = new Promise((resolve, reject) => {
  setTimeout(
    () => reject("promise one rejected"),
    Math.floor(Math.random() * 100)
  );
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(
    () => reject("promise two rejected"),
    Math.floor(Math.random() * 100)
  );
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(
    () => reject("promise three rejected"),
    Math.floor(Math.random() * 100)
  );
});

try{
(async function() {
  const result = await Promise.any([p1, p2, p3]);
  console.log(result); 
})();
} catch(error) {
  console.log(error.errors);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

报的错如下:

Uncaught (in promise) AggregateError: All promises were rejected
1

注意,必须是所有的 promise 都被 reject 之后才会抛出 AggregateError,如果有部分成功,那么将会返回成功的结果。

# 参考资料

(完)