美文网首页
小白手写promise.all || race()

小白手写promise.all || race()

作者: Grandperhaps | 来源:发表于2021-05-09 20:13 被阅读0次
参考文章

Promise.all是挂载到Promise类实例上
返回的是一个Promise
需要遍历入参数组中的每一项,判断传入的是不是promise,如果是promise则执行then方法,然后将then方法中的成功回调的data返回,失败则reject
如果入参数组中有基本数值,则直接返回
通过计数器,来判断函数的执行结果

function myPromiseAll(arr) {  // 参数是一个iterable对象,一般是数组
  // 返回一个Promise实例
   return new Promise((resolve, reject) => {
      var index = 0
      var result = []
      function newData(i,data){
        result[i] = data
        if(++index === arr.length){
          resolve(result)
        }
       }
       if (arr.lenght == 0) {
         resolve()
       } else {
         for(let i = 0; i < arr.length ; i++){
           if(arr[i].then){
            arr[i].then(data=>{
              newData(i,data)
             },(err)=>{
               reject(err)
               console.log(arr);
               // 输出传入的数组中每一个 promise 执行后的状态和值
               return
             })
           } else {
             newData(i,arr[i])
           }
         }
       }  
   });
}

let p1 = new Promise((resolve, reject)=> {
  setTimeout(resolve, 2000, "P1 resolved");
})

let p2 = new Promise((resolve, reject)=> {
  setTimeout(reject, 3000, "P2 resolved");
})

let p3 = new Promise((resolve, reject)=> {
  setTimeout(resolve, 4000, "P3 resolved");
})

let pResult = myPromiseAll([p1,p2,p3]);
pResult.then(value=>{
  console.log(pResult);
  console.log(value);
},err=> {
  console.log(pResult); 
  console.log(err);
})
//[
 // Promise { 'P1 resolved' },
//  Promise { <rejected> 'P2 resolved' },
//  Promise { <pending> }
//]
//Promise { <rejected> 'P2 resolved' }
//P2 resolved

promise.race()

Promise.race 就像他的名字一样"竞赛",取跑得最快的那个 Promise,成功就 resolve,失败就 reject。

所以直接在循环的每个 Promise里的 then 和 catch 里取 resolve 或者 reject,去触发最外层的 Promise。

function myPromiseRace(arr){
  return new Promise((resolve,reject)=>{
    arr.forEach(p=>{
      Promise.resolve(p).then(data=>{
        resolve(data)
      },err=>{
        reject(err)
      })
    })
  })
}
let p1 = new Promise((resolve, reject)=> {
  setTimeout(resolve, 2000, "P1 resolved");
})

let p2 = new Promise((resolve, reject)=> {
  setTimeout(resolve, 1000, "P3 resolved");
})
let pResult = myPromiseRace([p1,p2]);
pResult.then(value=>{
  console.log(pResult);
  console.log(value);
},err=> {
  console.log(pResult); 
  console.log(err);
})

相关文章

网友评论

      本文标题:小白手写promise.all || race()

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