Promise.all的一些思考和疑问!!!

本文探讨了Promise.all在处理异步操作中的作用,强调了当Promise链中出现reject时如何确保所有结果都能被捕捉。通过示例展示了如何利用.then处理reject状态,并提出了两种优化方案:使用map函数包裹Promise和创建自定义的Promise.allSelected方法,以更灵活地处理多个Promise的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise 做为ES6的新语法,是面试和开发过程中常用的,它处理异步操作!
有人就会问了,啥事异步操作,就是:

你打红蓝buff的时候顺便把旁边的蛤蟆怪给打了,一举两得,或者一举多得,提高了打野的效率,C位不carry,我自己carry!!!

Promise 有几个api:Promise.resolve、Promise.reject、Promise.all、Promise.race

下面我们来谈Promise.all ,哎!!!

直接上图,用法先介绍:

在这里插入图片描述

Promise.all([Promise.resolve(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err));
//  [1, 2, 3]

Promise.all 只在所有的 promise 都 resolve 时才会调用 .then 中的成功回调。

Promise.all([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err));
//  [1]

显然,这边出现了问题,Promise.reject直接中断了后面的Promise.resolve的操作。

我们想当 Promise.all中的 promise 对象 reject 失败时也能够调用回调函数,这个时候应该怎么做呢?

还不是用.then,为啥呢?因为.then返回的依旧是一个promise对象,不管是resolve还是reject都会执行.then。

Promise.all([Promise.reject(1).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err})),

Promise.resolve(2).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err})),

Promise.resolve(3).then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err}))   
 
])

.then(res=>console.log(res),err=>console.log(err));

// [{status:'not ok ',err:1}, {status:'ok',res:2}, {status:'ok',res:3}]

所有的都打印出来了!!! 包括resolve,reject状态!!!

如果按照上面的写法,假如有5个以上的请求,那么你是不是要写死!而且也不太复合我们传参的个数的严格限制!

那行!我们改写一波!!!! 写一个函数出来就行了!!!

function  handlePromise(promiseList) {
     return promiseList.map(promise=>promise.then((res)=>({status:'ok',res}),(err)=>({status:'not ok',err}))
     )
} 

这样调用promise.all 时,可以这么写

1、第一种:

Promise.all(handlePromise([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]))
.then(res=>console.log(res),err=>console.log(err))

2、第二种:

Promise.all = arr=>{
   let  aResult = [ ]; 
   return new Promise(function (resolve,reject){
    let i =0;
    next();
    function  next() {
      arr[i].then(function(res){
         aResult.push(res);
         i++;
         if(i==arr.length) {
            resolve(aResult)
       }else{
       next();
   }
    })
  }
})
}

3、第三种:
我们再提取的一波!!!promise新出的allSettled Api不太好,我们自己弄!!!!

Promise.allSelected= function (promiseList){
      return Promise.all(handlePromise(promiseList))
}

Promise.allSelected([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),err=>console.log(err))

好了,再见!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值