实现Promise.all()

135 阅读1分钟

实现Promise.all()

// 定义PromiseAll方法
const PromiseAll = (promises) => {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      return reject(new Error('传入的参数不是数组'));
    }
    let counter = 0;
    const results = [], length = promises.length;
    promises.forEach(item => {
      Promise.resolve(item).then(value => {
        counter++;
        results.push(value);
        if (counter === length) {
          resolve(results);
        }
      }).catch(err => {
        reject(err);
      })
    })
  })
}
  • 生成3个promise实例
// 成功
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('p1')
  }, 1000)
})

// 失败
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(new Error('p2 err'));
  }, 2000)
})

// 成功
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('p3')
  }, 3000)
})
  • 测试PromiseAll方法
// 1、有一个promise失败
const promise1 = PromiseAll([p1, p2, p3]);
promise1.then(values => {
  console.log(values)
}).catch(err => {
  console.log(err)
})

输入结果: p2失败,输出p2失败的结果 image.png

// 2、全部promise成功
const promise2 = PromiseAll([p1, p3]);
promise2.then(values => {
  console.log(values)
}).catch(err => {
  console.log(err)
})

输入结果: 全部promise成功,输入成功数组 image.png

// 3、传入参数不对
const promise3 = PromiseAll(p1, p3);
promise3.then(values => {
  console.log(values)
}).catch(err => {
  console.log(err)
})

输入结果: PromiseAll接收的参数不是数组,报错 image.png