手写Promise.all

139 阅读1分钟
Promise.myAll = function(list){
  const results = []
  let count = 0;
  return new Promise((resolve, reject)=>{
    list.map((item, index)=>{
      item.then(res=>{
        results[index] = res  // 按照传入的promise顺序存放到数组里面
        count +=1;
        if(count >= list.length) {resolve(results)}
      },reason => reject(reason))
    })
  })
}

 const p1 = new Promise((resolve, reject)=>{
  resolve(1)
})
const p2 = new Promise((resolve, reject)=>{
  resolve(2)
})
new Promise.all([p1,p2]).then(res=>{
  console.log('res',res);
})

函数封装版

let p1 = new Promise((resolve, reject)=>{
  setTimeout(() => {
    resolve(11111)
    // reject(1111)
  }, 3000);
})
let p2 = new Promise((resolve, reject)=>{
  setTimeout(() => {
    resolve(22222)
  }, 2000);
})
// p2.then(res=>console.log(res))
// Promise.all([p1, p2]).then(res=>{
//   console.log('res',res);
//   // res (2) [11111, 22222]
// })

function myPromiseAll(promiseArr){
  return new Promise((resolve, reject)=>{
    let resArr = [promiseArr.length]
    let num = 0
    promiseArr.forEach((item,idx)=>{
      item.then(res=>{
        // resArr.push(res)
        // 不使用push,为了防止结果顺序跟传入顺序不一致
        resArr[idx] = res
        num++
        if(num === promiseArr.length){
          resolve(resArr)
        }
      })
    })
  })
}
myPromiseAll([p1,p2]).then(res=>{
  console.log('res',res);
})