Promise.all()、Promise.allSettled()、Promise.race()三兄弟的区别

  1. Promise.all()
    Promise.alll() 具有并发执行异步任务的能力。但它的最大问题就是如果参数中的任何一个promise为reject的话,则整个Promise.all() 调用会立即终止,导致数据都无法返回。
    可以用于接口返回值有依赖的情况下使用

    Promise.all([
    	api.getUserInfo(), //接口
        api.getMemberInfo(),//接口
        api.getFocusedWechat(),//接口
    ]).then(res =>{
    	if (res[0].code === 0) {
    		console.log('success0')
    	}
    	if (res[1].code === 0) {
    		console.log('success1')
    	}
    }).catch((res)=> {
    	console.log('errorAll')
    })
    
  2. Promise.race()
    作用跟Promise.all() 类似,不同点在于:
    (1)如果最先返回的Promise请求是success状态,则不管其他请求是否成功,都能获取到返回值。

    例: A 最先完成 ,所以 D 行会执行(尽管第 B 行被拒绝)。
    C 行待确认是否会执行

    const promises = [
      new Promise((resolve, reject) =>
        setTimeout(() => resolve('result'), 100)), // (A)
      new Promise((resolve, reject) =>
        setTimeout(() => reject('ERROR'), 200)), // (B)
      new Promise((resolve, reject) =>
        setTimeout(() => resolve('result'), 300)), // (C)
    ];
    Promise.race(promises)
      .then((result) => assert.equal( // (D)
        result, 'result'));
    
    

    (2)如果最先返回的Promise请求是 reject 状态,则进行短路行为抛出异常;
    例: B 在 A 之前报错 ,所以不继续执行。

    const promises = [
      new Promise((resolve, reject) =>
        setTimeout(() => resolve('result'), 200)), // (A)
      new Promise((resolve, reject) =>
        setTimeout(() => reject('ERROR'), 100)), // (B)
    ];
    Promise.race(promises)
      .then(
        (result) => assert.fail(),
        (err) => assert.equal(// (C)
          err, 'ERROR'));
    
  3. Promise.allSettled()
    作用跟Promise.all() 类似,不同点在于,它不会进行短路。也就是说当Promise全部处理完成后,我们可以拿到每个Promise的状态,而不管是否处理成功。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值