实现promise.all和promise.race

2020-04-06  本文已影响0人  海山城

promise.all

使用方法

promise.all([promise1, promise2, promise]).then(([res1, res2, res3]) => {
}, (err) => {})
  1. 输入是一个promise数组
  2. 输出是一个promise对象
    resolve态:输入的所有的promise全部正确返回,才会返回一个resolve态promise对象。并且resolve态的结果值和参数传入顺序保持一致
    reject态:只要输入的promise中有一个错误的,就返回那个错误的结果(多个错误结果返回第一个返回的错误结果

实现

function test(text = "666", time = 1000) {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve(text)
    }, time)
  })
}

let p1 = test("p1", 3000)
let p2 = test("p2", 1000)
let p3 = test("p3", 2000)
let pArr = [p1, p2, p3]

function promiseAll(promiseArr){
  if(!Array.isArray(promiseArr)){
    return "参数为数组"
  }
  return new Promise(function(resolve, reject){
    let resolveValues = []
    let resolveCount = 0
    for(let i = 0; i < promiseArr.length; i++){
      Promise.resolve(promiseArr[i]).then(function(res){
        console.log("res", res) 
        // 和promise.race的主要差别
        resolveCount++
        resolveValues[i] = res
        if(resolveCount === promiseArr.length){
          resolve(resolveValues)
        }
      }, function(err){
         reject(err)
      })
    }
  })
}

promiseAll(pArr).then((res) => {
  console.log("res", res)
}, (err) => {
  console.log("err", err)
})

promise.race

使用方法

promise.race([promise1, promise2, promise]).then((res) => {
}, (err) => {})
  1. 输入是一个promise数组
  2. 输出是一个promise对象。输出的是第一个返回的promise对象。无论成功还是失败

实现

function test(text = "666", time = 1000) {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve(text)
    }, time)
  })
}

let p1 = test("p1", 3000)
let p2 = test("p2", 1000)
let p3 = test("p3", 2000)
let pArr = [p1, p2, p3]

function promiseRace(promiseArr){
  if(!Array.isArray(promiseArr)){
    return "参数为数组"
  }
  return new Promise(function(resolve, reject){
    for (let i = 0 ; i < promiseArr.length; i++){
      Promise.resolve(promiseArr[i]).then((res)=>{
        resolve(res) // 和promise.all的主要差别
      },(err)=>{
        reject(err)
      })
    }
  })
}

promiseRace(pArr).then((res) => {
  console.log("res", res)
}, (err) => {
  console.log("err", err)
})
上一篇下一篇

猜你喜欢

热点阅读