typescript中的并发编程,promise.all使用笔记

41 阅读1分钟

Promise.all() 是 JavaScript 中用于处理多个并行异步操作的 Promise 方法,其核心作用是:将多个 Promise 实例包装成一个新的 Promise 实例,等待所有异步操作都成功完成后,统一返回所有结果;若其中任何一个操作失败,则立即返回失败原因

具体特性:

  1. 参数:接收一个可迭代对象(通常是 Promise 数组)作为参数。
  2. 成功场景:当所有传入的 Promise 都变为 resolved 状态时,Promise.all() 返回的新 Promise 会变为 resolved,并将所有结果按原顺序组成数组返回(即使某个 Promise 先完成,结果仍保持输入顺序)。
  3. 失败场景:只要有一个传入的 Promise 变为 rejected 状态,Promise.all() 会立即变为 rejected,并返回第一个被拒绝的原因(其余未完成的 Promise 仍会执行,但结果会被忽略)。

示例代码:

// 模拟3个异步操作
const promise1 = Promise.resolve(1);
const promise2 = new Promise((resolve) => setTimeout(() => resolve(2), 1000));
const promise3 = fetch('https://api.example.com/data').then(res => res.json());

// 使用Promise.all()并行处理
Promise.all([promise1, promise2, promise3])
  .then(results => {
    // 所有操作成功:results为 [1, 2, 接口返回数据]
    console.log('所有操作完成:', results);
  })
  .catch(error => {
    // 若任何一个操作失败,立即执行这里
    console.log('有操作失败:', error);
  });

适用场景:

  • 需要多个异步结果共同参与后续逻辑时(例如:同时获取用户信息、权限列表、配置数据,全部获取后再渲染页面)。
  • 希望并行执行以提高效率(相比串行执行,减少总耗时)。

注意点:

  • 若需要等待所有操作完成(无论成功或失败),可使用 Promise.allSettled()
  • 若只需获取第一个完成的结果(无论成功或失败),可使用 Promise.race()