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的状态,而不管是否处理成功。

上一篇:手撕系列——>手撕Promise


下一篇:JavaScript引擎底层的工作原理