以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
34. 实现`Promise.any()`

Promise.any = function (promises) {
  return new Promise((resolve, reject) => {
    let errors = [];
    for (let promise of promises) {
      Promise.resolve(promise).then(resolve).catch((error) => errors.push(error));
    }
    if (errors.length === promises.length) {
      reject(new AggregateError('No Promise in Promise.any was resolved', errors));
    }
  });
};

我们先定义一个全局函数Promise.any(),它接收一个Promise可迭代器。然后我们返回一个新的Promise实例,里面包含了我们的业务逻辑。

在新的Promise实例里,我们使用了一个let errors空数组,当任何一个Promise成功被解析时,我们就将它的结果作为参数传入新的Promise实例中的resolve函数中,并终止迭代。

但是,如果所有的Promise都出现了拒绝,那么我们就会在catch块中捕捉到异常,我们将每个Promise的异常都放入errors数组中。如果errors的长度等于迭代器的最大长度,那么就表示所有的Promise都出现了拒绝,这个Promise.any()实例也应该拒绝,并且将errors数组作为第二个参数一同传入一个AggregateError实例中。

附注:AggregateError是ES2020新引入的一个错误类型,代表了多个错误的聚合体。