分析Promise.all(),Promise.allSettled(),Promise.race(),Promise.any()区别、作用以及使用场景

Promise.all()

用于将多个 Promise 实例,打包成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);
  • 只有p1、p2、p3的状态都会变fulfilled,p的状态才会变fulfilled,此时p1、p2、p3的返回值组成为一个数组,传给p的回调数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变了rejected,此时第一个reject实例的返回值,会传给p。

p1、p2、p3都是Promise实例,如果不是,会先调用Promise.resolve方法,将参数转为Promise实例,再进行一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具备 Iterator 接口,并且返回的每个成员都是 Promise 实例。

注意,如果为参数的 Promise 实例,确定了catch方法,那么它一旦被rejected,就不会触及Promise.all()的catch方法。

Promise.allSettled()

接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例

let p = Promise.allSettled([1, p2, 3]);
// [
//    { status: 'fulfilled', value: 3 },
//    { status: 'fulfilled', value: 30 }
//    { status: 'rejected', reason: -1 }
// ]

只有等到参数组的1, p2, 3都发生状态改变(不管是fulfilled还是rejected),返回的p状态才会变化。

与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理

Promise.race()

用于将多个 Promise 实例,打包成一个新的 Promise 实例。

const p = Promise.race([p1, p2, p3]);

只要p1、p2、p3其中有一个实例率先改变状态,p的状态就跟着改变,而这个率先改变的Promise实例的返回值,就传给p的回调函数。

与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理

Promise.any()

该方法接受一组Promise实例作为参数,打包成一个新的Promise实例返回。

let p = Promise.any([p1, p2, 3]);

只要参数p1, p2, 3有一个变成fulfilled状态,p实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

注意: 它不会因为一个参数Promise 变成rejected而结束,必须等到所有参数 Promise 变成rejected才结束。

与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理

差异比较

根据参数执行状态,比较p的状态决定因素、值以及是否需要等待参数实例执行完毕。

方法p状态决定因素p成功状态来源p失败状态来源是否需参数实例全部执行完毕作用场景
all全成则成,一败就败所有参数返回值组成的数组第一个失败的返回值成是,败否要求一组异步操作全部成功或者其中一个失败就调用的场景
any一成则成,全败才败第一个成功的返回值一个AggregateError实例,属性errors是一个包含了所有成员的错误的数组成否,败需一组异步操作只要有一个成功或要求全失败就调用的场景
allSettled全变才变,不管成败无论成败,都是一个包含对应参数状态的数组无论成败,都是一个包含对应参数状态的数组一组异步操作全部结束后再调用的场景
race谁先变跟谁第一个成功的返回值第一个失败的返回值一组异步操作第一个成功或者失败后就调用的场景
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值