[代码实现] 手写代码实现 promise.all

下面是手写实现 Promise.all() 方法的代码:

Promise.all = function (promises) {
  return new Promise((resolve, reject) => {
    let results = [];
    let count = 0;
    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(
        (result) => {
          results[index] = result;
          count++;
          if (count === promises.length) {
            resolve(results);
          }
        },
        (reason) => {
          reject(reason);
        }
      );
    });
  });
};

实现原理:

Promise.all() 方法接收一个包含多个 Promise 的数组作为参数,并返回一个新的 Promise。该 Promise 将会在数组中所有 Promise 状态均为 fulfilled 时被解决,并且以数组形式返回所有 Promise 的结果。

我们可以通过创建一个新的 Promise,然后遍历 Promise 数组并将每个 Promise 包装在一个 Promise.resolve() 中,然后使用 .then() 方法将它们的解决值和拒绝原因分别传递给新的 Promise 的 resolve()reject() 方法。我们还需要维护一个计数器和一个结果数组来跟踪所有 Promise 的状态。每当一个 Promise 被解决时,我们将其结果存储在结果数组中,然后将计数器增加 1。当计数器等于 Promise 数组的长度时,说明所有 Promise 均已被解决,此时我们可以使用 resolve() 方法并将结果数组作为参数传递给它。如果有任何一个 Promise 被拒绝,则使用 reject() 方法并将其拒绝原因作为参数传递给它。

需要注意的是,如果 Promise 数组为空,则 Promise.all() 将立即被解决,并返回一个空数组。