哈哈哈介绍一下 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 完成(无论成功或失败),返回一个包含全部结果的数组。
- 统一结构:每个结果对象包含
status(fulfilled或rejected)和对应的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() | 首个完成即返回 | 仅返回第一个结果 | 跟随首个结果状态 | 超时控制、竞速优化 |