Promise.all/Promise.race

83 阅读2分钟
手写promise.all()
function promiseAll(itertor){
  let promises = Array.from(itertor)
  let len = promises.length
  let index = 0 //每当执行成功就+1,当index等于len的时候,说明所有数据都返回,则可以resolve
  let data = [] //存放的是要返回的包含所有promise数据的数组
  // 遍历这个promise数组
  return new Promise((resolve,reject)=>{
    for(let i in promises){
      promises[i].then((res)=>{
        data[i] = res //这里是在保证顺序是跟peomise的顺序是一致的
        if(++index === len){
          //这个时候说明所有的promise都执行完成了
          resolve(data)
        }
      }).catch((err)=>{
        reject(err) //只要有一个报错,整个Promises就reject
      })
    }
  })
}

let promise1 = new Promise(function(resolve,reject){
  console.log("1111")
  resolve("promise1")
})
let promise2 = new Promise(function(resolve,reject){
  console.log("2222")
  // resolve("promise2")
  reject("promise2")
})
let promise3 = new Promise(function(resolve,reject){
  console.log("3333")
  resolve("promise3")
})

promiseAll([promise1,promise2,promise3]).then((res)=>{
  console.log("执行结果",res)
}).catch((err)=>{
        console.log("执行结果err",err)
})


//promise2设置resolve的结果
1111
2222
3333
['promise1', 'promise2', 'promise3']
//promise2设置reject的结果
1111
2222
3333
执行结果err promise2
手写promise.race()
function promiseRace(itertor){
  let promises = Array.from(itertor)
  // 遍历这个promise数组
  return new Promise((resolve,reject)=>{
    for(let i in promises){
      promises[i].then((res)=>{
        resolve(res) //返回第一执行完成的结果,无所谓是哪个promise先执行完成
      }).catch((err)=>{
        reject(err) //只要有一个报错,整个Promises就reject
      })
    }
  })
}


let promise1 = new Promise(function(resolve,reject){
  console.log("1111")
  setTimeout(()=>{
    resolve("promise1")
  },100)
})
let promise2 = new Promise(function(resolve,reject){
  console.log("2222")
  // resolve("promise2")
  reject("promise2")
})
let promise3 = new Promise(function(resolve,reject){
  console.log("3333")
  setTimeout(()=>{
    resolve("promise3")
  },200)
  
})

promiseRace([promise1,promise2,promise3]).then((res)=>{
  console.log("执行结果",res)
}).catch((err)=>{
        console.log("执行结果err",err)
})

//执行结果,可以设置定时器来看是不是返回最先执行完成的结果
1111
2222
3333
执行结果err promise2

promise.all()和promise.race()的相同

无论执行结果是什么,数组里面的每个promise都会执行。

promise.all()和promise.race()的不同
  1. promise.all():数组中所有项都resolve才resolve,只要有一个是reject,就是reject。
  2. promise.race():执行结果是最先完成的那个promise的结果。