Promise.all一次错误的实现

35 阅读1分钟

今天翻以前好久之前写的代码,突然发现一个当初由于对Promise了解不深导致的错误,并记录(奇怪的是我的Promise.any自我实现是正常的emmm)。

  const myPromiseAll = (fnList) => {
    return new Promise((resolve, reject) => {
      const res = [];
      const len = fnList.length;
      let hasRejected = false;
      let err = null;
      let count = 0;
      for (let i = 0; i < len; i++) {
        Promise.resolve(fnList[i]).then((val) => {
          res[i] = val
        }).catch((val) => {
          if (!hasRejected) {
            hasRejected = true;
            err = val;
          }
        }).finally(() => {
          count++;
          if (count === len) {
            if (!hasRejected) {
              resolve(res)
            } else {
              reject(err)
            }
          }
        })
      }
    })
  }

错误原因:promise.all并不是全部执行完后判断,而是在发生错误时直接返回reject。 原函数执行时: 打印顺序为:1000正确执行 > 2000错误执行 > 3000错误执行 > catch; 正确顺序应为 1000正确执行 > 2000错误执行 > catch > 3000错误执行

  const fn = (time) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (time < 2000) {
          console.log(time + '正确执行');
          resolve(time + '正确执行');
        } else {
          console.log(time + '发生错误');
          reject(time + '发生错误');
        }
      }, time)
    })
  }
  myPromiseAll([fn(1000), fn(2000), fn(3000)]).then(res => {
      console.info('res')
    }).catch(err => {
      console.info('catch')
  })

函数修改如下:

  const myPromiseAll = (fnList) => {
    return new Promise((resolve, reject) => {
      const res = [];
      const len = fnList.length;
      let count = 0;
      for (let i = 0; i < len; i++) {
        Promise.resolve(fnList[i]).then((val) => {
          res[i] = val
        }).catch((err) => {
          reject(err)
        }).finally(() => {
          count++;
          if (count === len) {
            resolve(res)
          }
        })
      }
    })
  }