最简单的手写promise.all(包含错误处理)【学不会你打我】

197 阅读1分钟

【莞式服务】手写实现+测试用例

  • 利用Promise.resolve静态方法可以很方便的对入参进行转化
  • 当入参中某个promise被拒绝时整体直接拒绝,并抛出拒绝值
const promiseAll = (...prs) => {
  let resArr = [],
    count = 0;
  return new Promise((resolve, reject) => {
    for (let i = 0; i < prs.length; i++) {
      // 处理当传入对象不是promise的情况
      //   利用promise.resolve将传入对象展开
      Promise.resolve(prs[i])
        .then((res) => {
          resArr[i] = res;
          count++;
          if (count === prs.length) {
            resolve(resArr);
          }
        })
        //   如果其中有promise被拒绝,直接reject
        .catch((e) => reject(e));
    }
  });
};

// 测试
let pr1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("hello");
  }, 2000);
});

let pr2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("world");
  }, 2000);
});

let rejectPr = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("opps");
  }, 4000);
});

promiseAll(pr1, pr2, rejectPr)
  .then((res) => {
    console.log("all is over", res);
  })
  .catch((err) => {
    //  something is wrong opps
    console.log("something is wrong", err);
  });

//   直接传入原始值也是ok的
promiseAll(1, 2, "HAH", "LALAL")
  .then((res) => {
    console.log("all is over", res);
  })
  .catch((err) => {
    //  all is over [ 1, 2, 'HAH', 'LALAL' ]
    console.log("something is wrong", err);
  });