手写Promise.all

74 阅读1分钟

关键知识点

  • 异步操作成功时,Promise会将成功的结果作为参数传递给then方法的第一个回调函数
  • 异步操作失败时,Promise会将报错的信息作为参数传递给then方法的第二个回调函数
  • Promise.all的状态改变有两种方式
    • 第一种是const p = Promise([p1,p2,p3])中的p1,p2,p3的状态都变成fufilled
    • 第二种是const p = Promise([p1,p2,p3])中第一个变成rejected
Promise.myAll = function (promiseArr) {
  // Promise.all返回值是数组
  const results = [];
  // 计算fulfilled的数量
  let count = 0;

  return new Promise((resolve, reject) => {
    promiseArr.map((promiseItem, index) => {
      // 这里的result是Promise实例异步操作成功后返回的结果
      promiseItem.then(
        (result) => {
          // 将成功返回的结果放置到数组中
          results[index] = result;
          // 记录数组中resolved的数量
          count += 1;
          // 当数组中的resolved的数量等于数组的长度,也就是说所有的Promise都已经resolved了,那么就将这个数组resolved出去
          if (count === promiseArr.length) {
            resolve(results);
          }
        },
        // Promise异步操作失败时,会将错误抛出,作为then方法中reject函数的参数
        (rejectErr) => {
          reject(rejectErr);
        }
      );
    });
  });
};

p1 = Promise.resolve();
p2 = Promise.resolve();
p3 = Promise.reject();

Promise.myAll([p3]);