Promise.all的用法和缺点

上次面试总有面试官问我知道promise吗,用过什么api吗,知道promise.all吗,我寻思着我知道啊,就是传一个数组,里面有你要执行的异步任务,作为一个异步任务队列,等全部完成以后,返回的res中会有几个异步任务的返回值,会以数组的形式返回。

面试官总是问有没有什么缺点,给我整蒙了,我一般知道的就是promise各种好,但是好多人问,我就下去查了下,终于知道了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(1), Promise.reject(2), Promise.resolve(3)])
        .then(res => console.log(res),err=>console.log(err))
// 2

那么问题来了,只要有一个任务失败就不会走.then后面的方法,而且不会吐出你想要的全部返回值,只会吐出失败的返回值。

针对这个问题,有一个解决办法,我们知道.then吐出的是promise对象,说不清楚上代码。

 var p = new Promise((resolve,reject)=>{
        reject('失败了')
    }).then(res=>{
        console.log(res)
    },err=>{
        console.log(err)
    }).then(res=>{
        console.log('成功')
    },err=>{
        console.log('失败')
    })

//失败了
//成功

第二个的then执行成功还是失败依第一个then而确定,第一个then中没有异步任务的时候,吐出的promise的状态是成功的,如果有return的话,可以传递return中的参数。

以此为例,我们的问题就有了解决办法。

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

//1
//2
//3

要求比较高的可以优化一下。

 function handlePromise(promiseList) {
    return promiseList.map(promise =>
      promise.then(res=>(res),err=>(err))
    )
  }

  Promise.promiseAll=function(promiseList){
      return Promise.all(handlePromise(promiseList))
  }
  
  Promise.promiseAll([Promise.reject(1),Promise.resolve(2),Promise.resolve(3)]).then(res=>console.log(res),
  err=>{console.log(err)})

//[1,2,3]

Promise是一种用于处理异步操作的编程模式。它可以更优雅地处理回调地狱问题,使异步代码更易于理解维护。 理解:Promise是一个代表异步操作最终完成或失败的对象。它有三个状态:pending(进行中)、fulfilled(已完成)rejected(已失败)。可以通过调用resolve函数将Promise从pending状态转为fulfilled状态,或者通过调用reject函数将其转为rejected状态。Promise对象可以通过链式调用then()方法来处理成功的结果,或者通过catch()方法来处理失败的结果。 优点: 1. 可以避免回调地狱:通过链式调用then()方法,代码更易读、理解维护。 2. 更好的错误处理:在链式调用中,可以通过catch()方法捕获并统一处理错误。 3. 支持并发操作:可以使用Promise.all()来并行执行多个Promise,等待它们都完成后再进行处理。 4. 可以灵活地组合使用:可以使用Promise的一些方法,如race()、allSettled()、finally()等,来满足不同的需求。 缺点: 1. 无法取消Promise:一旦创建了Promise对象,就无法取消它。这可能会导致资源的浪费。 2. 无法捕获所有错误:在Promise链中,如果没有使用catch()方法或没有处理异常,可能会导致错误被忽略或未被正确处理。 3. 代码可读性不高:尽管Promise可以解决回调地狱问题,但在处理复杂的异步操作时,可能会导致代码变得冗长难以理解。 总的来说,Promise是一种非常有用的异步编程模式,它在处理异步操作时提供了更好的控制可读性,但也需要谨慎使用,避免滥用忽略错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值