如何手写 Promise.all?

126 阅读1分钟

如何使用 Promise.all(MDN)

Promise.all(iterable) 这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败。

这个新的promise对象在触发成功状态以后,会把一个包含iterable里所有promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致;

如果这个新的promise对象触发了失败状态,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。

Promise.all方法常被用于处理多个promise对象的状态集合

手写 Promise.all要点:

  1. 知道要在 Promise 上写而不是在原型上写
  1. 知道 all 的参数(Promise 数组)和返回值(新 Promise 对象)
  1. 知道用数组来记录结果
  1. 知道只要有一个 reject 就整体 reject

代码实现:

Promise.prototype.myAll
Promise.myAll = 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) )
    })
  })
}