Promise.any()

Promise.any()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。该方法目前是一个第三阶段的提案

Promise.any()Promise.race()方法很像,只有一点不同,就是不会因为某个 Promise 变成rejected状态而结束。

  1. const promises = [
  2. fetch('/endpoint-a').then(() => 'a'),
  3. fetch('/endpoint-b').then(() => 'b'),
  4. fetch('/endpoint-c').then(() => 'c'),
  5. ];
  6. try {
  7. const first = await Promise.any(promises);
  8. console.log(first);
  9. } catch (error) {
  10. console.log(error);
  11. }

上面代码中,Promise.any()方法的参数数组包含三个 Promise 操作。其中只要有一个变成fulfilledPromise.any()返回的 Promise 对象就变成fulfilled。如果所有三个操作都变成rejected,那么await命令就会抛出错误。

Promise.any()抛出的错误,不是一个一般的错误,而是一个 AggregateError 实例。它相当于一个数组,每个成员对应一个被rejected的操作所抛出的错误。下面是 AggregateError 的实现示例。

  1. new AggregateError() extends Array -> AggregateError
  2. const err = new AggregateError();
  3. err.push(new Error("first error"));
  4. err.push(new Error("second error"));
  5. throw err;

捕捉错误时,如果不用try...catch结构和 await 命令,可以像下面这样写。

  1. Promise.any(promises).then(
  2. (first) => {
  3. // Any of the promises was fulfilled.
  4. },
  5. (error) => {
  6. // All of the promises were rejected.
  7. }
  8. );

下面是一个例子。

  1. var resolved = Promise.resolve(42);
  2. var rejected = Promise.reject(-1);
  3. var alsoRejected = Promise.reject(Infinity);
  4. Promise.any([resolved, rejected, alsoRejected]).then(function (result) {
  5. console.log(result); // 42
  6. });
  7. Promise.any([rejected, alsoRejected]).catch(function (results) {
  8. console.log(results); // [-1, Infinity]
  9. });