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

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

可以使用以下代码实现自己的Promise.all()

function PromiseAll(promises) {
  return new Promise(function(resolve, reject) {
    let results = [];
    let count = 0;
    
    promises.forEach(function(p, i) {
      Promise.resolve(p).then(function(res) {
        results[i] = res;
        count++;
        
        if (count === promises.length) {
          resolve(results);
        }
      }).catch(function(err) {
        reject(err);
      });
    });
  });
}

使用方法如下:

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

PromiseAll([promise1, promise2, promise3])
  .then(function(results) {
    console.log(results); // [1, 2, 3]
  }).catch(function(err) {
    console.error(err);
  });

这个实现中,我们创建了一个新的Promise。我们迭代给定的promises数组,并使用Promise.resolve()方法将每个值都包装成一个Promise对象。如果传入的参数不是具有 Promise 解析规则的对象,则Promise.resolve(value)将返回一个状态设置为已解决(resolved)并且其值为valuePromise 对象。 所以这样可以确保参数一定是一个Promise对象。

在每个Promise对象解决之后,我们将结果存储到results数组中,并增加count变量以跟踪已解决的Promise对象的数量。如果count等于promises数组的长度,则说明所有的Promise对象都已经解决,我们通过调用resolve()方法并传入results数组来解决新的Promise对象。

如果有一个Promise对象被拒绝了,则我们通过调用reject()方法并传递拒绝的原因来拒绝新的Promise对象。

这个实现和Promise.all() 函数有一些细微的差别,例如在结果数组中,如果原始数组中的项为非Promise类型,则结果数组的值与原数组的值相同。在Promise.all()中,如果原始数组中的项不是Promise类型,则会自动转换为解决的Promise对象,而在我们的实现中则不会。

但是,这个实现的核心思想与Promise.all()相同,都使用异步操作并在所有Promise对象解决时进行回调。