前端面试之手写Promise.all

75 阅读1分钟

前端面试官大佬们似乎很爱问这道题,以下是小弟经过查阅资料,自己经过深思熟虑又做了一些小的修改后得出的结果。初步测试可用,但不敢保证所有极端情况都没问题。小弟一直好奇到底有没有人能在面试那种容易紧张、时间有限、又没有见过这道题的情况下能准确无误的写出来,如果有,请受小弟一拜🤣

Promise.myAll = function (promises) {
  // 参数promises是空数组的情况:
  if (Array.isArray(promises) && promises.length === 0) {
    return Promise.resolve(promises);
  }

  return new Promise((resolve, reject) => {
    const results = [];
    let resolvedCount = 0;

    promises.forEach((promise, i) => {
      // 用Promise.resolve包一下,因为传入的不一定都是Promise,如:Promise.all([1, 2, 3]);
      Promise.resolve(promise)
        .then((value) => {
          results[i] = value;
          resolvedCount++;
          if (resolvedCount >= promises.length) {
            resolve(results);
          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  });
};