美文网首页
实现promise.all和promise.race

实现promise.all和promise.race

作者: 海山城 | 来源:发表于2020-04-06 00:20 被阅读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)
    })
    

    相关文章

      网友评论

          本文标题:实现promise.all和promise.race

          本文链接:https://www.haomeiwen.com/subject/sbsmphtx.html