让人意外的Promise场景

215 阅读3分钟
哈哈哈介绍一下 promise.all()、promise.allSetted()、promise.race()

Promise 提供了多个方法用于处理多个异步操作的并行执行,其中 Promise.all()Promise.allSettled() 和 Promise.race() 是常用的三种方法。以下将结合功能特点、使用场景及示例进行详细解析:

1. Promise.all()

功能特点

  • 并行执行:所有 Promise 实例会立即并发执行,而非按顺序依次执行 
  • 结果顺序保证:返回结果数组的顺序与输入 Promise 的顺序一致,不受完成时间影响 
  • 快速失败机制:若任一 Promise 被拒绝(rejected),则整体立即拒绝,返回第一个拒绝的原因;若全部成功,则返回所有结果的数组 

适用场景

  • 需要同时发起多个无依赖关系的异步请求,且必须全部成功后才能继续后续逻辑(如批量接口请求、多文件上传等)
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = new Promise((resolve) => setTimeout(resolve, 1000, 3));

Promise.all([p1, p2, p3])
  .then(values => console.log(values)) // [1, 2, 3](约1秒后输出)
  .catch(error => console.error(error));
  • 注意:若传入空数组,会立即解决为一个空数组。

2. Promise.allSettled()

功能特点

  • 全量等待:等待所有 Promise 完成(无论成功或失败),返回一个包含全部结果的数组。 
  • 统一结构:每个结果对象包含 statusfulfilledrejected)和对应的 value 或 reason 。
  • 无失败中断:即使部分 Promise 失败,仍会返回所有结果。 

适用场景

  • 需要获取所有异步操作的最终状态(如统计请求成功率、批量操作后记录日志)。
const p1 = Promise.resolve(1);
const p2 = Promise.reject("Error");

Promise.allSettled([p1, p2])
  .then(results => {
    results.forEach(result => {
      if (result.status === "fulfilled") {
        console.log("成功:", result.value);
      } else {
        console.log("失败:", result.reason);
      }
    });
  });
// 输出:
// 成功: 1
// 失败: Error

3. Promise.race()

功能特点

  • 竞速机制:返回第一个完成的 Promise 结果(无论成功或失败)。
  • 短路特性:若第一个完成的 Promise 失败,则整体立即失败;若成功则直接返回结果。
  • 超时控制:常用于设置异步操作超时限制。

适用场景

  • 需要快速响应最先完成的异步操作(如资源加载超时处理、多服务器请求择优)
const p1 = new Promise(resolve => setTimeout(resolve, 500, "Fast")); 
const p2 = new Promise(resolve => setTimeout(resolve, 1000, "Slow")); 
Promise.race([p1, p2])
.then(value => console.log(value)) // "Fast"(约0.5秒后输出) .catch(error => console.error(error));

超时控制示例

const fetchData = fetch("https://api.example.com/data");
const timeout = new Promise((_, reject) => 
  setTimeout(() => reject("Timeout"), 5000)
);

Promise.race([fetchData, timeout])
  .then(data => console.log("数据加载成功"))
  .catch(error => console.error("失败:", error)); // 5秒内未响应则超时

对比总结

方法执行机制结果处理失败行为典型场景
Promise.all()并行执行,全部成功结果数组按输入顺序排列任一失败则立即拒绝无依赖批量请求、多资源加载
Promise.allSettled()并行执行,全量等待包含所有结果的描述对象不中断,返回全部状态统计、日志记录
Promise.race()首个完成即返回仅返回第一个结果跟随首个结果状态超时控制、竞速优化