JavaScript中的Promise.all、Promise.race、Promise.allSettled与Promise.any的区别与应用
字数 1322 2025-11-24 22:08:12
JavaScript中的Promise.all、Promise.race、Promise.allSettled与Promise.any的区别与应用
描述
在JavaScript异步编程中,Promise的复合方法用于处理多个Promise实例的并发操作。Promise.all、Promise.race、Promise.allSettled和Promise.any是四种核心方法,它们根据不同的需求对Promise组采取不同的处理策略。理解它们的区别和适用场景,对于编写高效的异步代码至关重要。
解题过程
-
Promise.all
- 作用:接收一个Promise实例数组,当所有Promise都成功完成(fulfilled)时,返回一个包含所有结果的数组;如果任意一个Promise被拒绝(rejected),则立即抛出拒绝原因(短路特性)。
- 适用场景:多个异步任务强依赖,需要全部成功才能继续。
- 示例:
const p1 = Promise.resolve(1); const p2 = Promise.resolve(2); Promise.all([p1, p2]).then(results => { console.log(results); // [1, 2] }); const p3 = Promise.reject("Error"); Promise.all([p1, p3]).catch(err => { console.log(err); // "Error" });
-
Promise.race
- 作用:返回第一个状态改变的Promise的结果(无论成功或失败)。
- 适用场景:超时控制或竞争性任务(如最快响应获胜)。
- 示例:
const fast = new Promise(resolve => setTimeout(() => resolve("Fast"), 100)); const slow = new Promise(resolve => setTimeout(() => resolve("Slow"), 200)); Promise.race([fast, slow]).then(result => { console.log(result); // "Fast" }); const timeout = Promise.reject("Timeout"); Promise.race([fast, timeout]).catch(err => { console.log(err); // "Timeout" });
-
Promise.allSettled
- 作用:等待所有Promise完成(无论成功或失败),返回一个包含每个Promise状态和结果的对象数组。
- 适用场景:需要知道所有异步操作的最终状态,无短路逻辑。
- 示例:
const successes = [Promise.resolve(1), Promise.resolve(2)]; const mixed = [Promise.resolve(1), Promise.reject("Error")]; Promise.allSettled(mixed).then(results => { console.log(results); // [ // { status: "fulfilled", value: 1 }, // { status: "rejected", reason: "Error" } // ] });
-
Promise.any
- 作用:返回第一个成功的Promise的结果;如果所有Promise都失败,则聚合所有错误原因(通过AggregateError)。
- 适用场景:需要至少一个成功结果,忽略失败(如多源数据请求)。
- 示例:
const failFast = Promise.reject("Error1"); const succeedLater = new Promise(resolve => setTimeout(() => resolve("Success"), 100)); Promise.any([failFast, succeedLater]).then(result => { console.log(result); // "Success" }); Promise.any([Promise.reject("Error1"), Promise.reject("Error2")]) .catch(err => { console.log(err.errors); // ["Error1", "Error2"] });
总结对比
| 方法 | 成功条件 | 失败条件 | 返回值结构 |
|---|---|---|---|
Promise.all |
全部成功 | 任意失败 | 结果数组 |
Promise.race |
第一个状态改变 | 第一个状态改变 | 第一个结果或错误 |
Promise.allSettled |
全部完成(无论成败) | 不适用 | 状态描述对象数组 |
Promise.any |
至少一个成功 | 全部失败 | 第一个成功值或AggregateError |
通过选择合适的方法,可以更精准地控制并发异步任务的行为与错误处理。