手写Promise.all、Promise.race

52 阅读1分钟

Promise.all

只要有一个reject就整体reject

Promise.all = function (list) {
  const results = [];
  let count = 0;
  return new Promise((resolve, reject) => {
    list.map((item, index) => {
      item.then(
        (result) => {
          results[index] = result;
          count += 1;
          if (count >= list.length) {
            resolve(results);
          }
        },
        (reason) => reject(reason)
      );
    });
  });
};

Promise.race

谁先完成就resolve或者reject谁

Promise.race = function (list) {
  let arr = list.map((item) =>
    item instanceof Promise ? item : Promise.resolve(item)
  );
  return new Promise((resolve, reject) => {
    for (let i = 0; i <= arr.length; i++) {
      arr[i].then(
        (data) => resolve(data),
        (error) => reject(error)
      );
    }
  });
};