当前位置: 代码迷 >> 综合 >> Promise.all()、Promise.allSettled()、Promise.race()三兄弟的区别
  详细解决方案

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

热度:84   发布时间:2023-12-04 00:17:06.0
  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的状态,而不管是否处理成功。

  相关解决方案