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组采取不同的处理策略。理解它们的区别和适用场景,对于编写高效的异步代码至关重要。

解题过程

  1. 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"  
      });  
      
  2. 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"  
      });  
      
  3. 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" }  
        // ]  
      });  
      
  4. 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

通过选择合适的方法,可以更精准地控制并发异步任务的行为与错误处理。

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),则立即抛出拒绝原因(短路特性)。 适用场景 :多个异步任务强依赖,需要全部成功才能继续。 示例 : Promise.race 作用 :返回第一个状态改变的Promise的结果(无论成功或失败)。 适用场景 :超时控制或竞争性任务(如最快响应获胜)。 示例 : Promise.allSettled 作用 :等待所有Promise完成(无论成功或失败),返回一个包含每个Promise状态和结果的对象数组。 适用场景 :需要知道所有异步操作的最终状态,无短路逻辑。 示例 : Promise.any 作用 :返回第一个成功的Promise的结果;如果所有Promise都失败,则聚合所有错误原因(通过AggregateError)。 适用场景 :需要至少一个成功结果,忽略失败(如多源数据请求)。 示例 : 总结对比 | 方法 | 成功条件 | 失败条件 | 返回值结构 | |--------------------|--------------------------|--------------------------|--------------------------------| | Promise.all | 全部成功 | 任意失败 | 结果数组 | | Promise.race | 第一个状态改变 | 第一个状态改变 | 第一个结果或错误 | | Promise.allSettled | 全部完成(无论成败) | 不适用 | 状态描述对象数组 | | Promise.any | 至少一个成功 | 全部失败 | 第一个成功值或AggregateError | 通过选择合适的方法,可以更精准地控制并发异步任务的行为与错误处理。