Promise.all 和 Promise.allSettled的区别与应用

文章介绍了Promise.all和Promise.allSettled两种处理多个Promise的方法。Promise.all在所有Promise成功时返回结果数组,若有任何一个失败则返回拒绝的Promise。而Promise.allSettled等待所有Promise完成,返回每个Promise的状态和值,无论成功或失败。文章通过axios发送HTTP请求的示例展示了两者的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Promise.all:

  • 当所有的Promise都成功(resolve)时,Promise.all返回一个包含所有Promise结果的数组。
  • 如果任何一个Promise被拒绝(reject),Promise.all会立即返回一个被拒绝的Promise,并带有第一个被拒绝Promise的错误信息。
  • 结果数组的顺序与传入的Promise数组的顺序相同。

2、Promise.allSettled:

  • Promise.allSettled返回一个Promise,该Promise在所有的Promise都已完成(不管是成功还是失败)后解析。
  • 返回的Promise最终会以一个包含每个Promise结果的对象数组的形式进行解析。
  • 每个对象具有statusvalue属性:
    • status可为字符串"fulfilled"表示成功、或字符串"rejected"表示拒绝。
    • value属性存储了已解决或已拒绝的值。
  • Promise.allSettled不会中断执行,而是等待所有Promise都解决或拒绝,然后返回结果。

总结:

  • Promise.all在全部成功时才返回,一旦有Promise被拒绝,立即返回拒绝的Promise。
  • Promise.allSettled会等待所有Promise都完成(无论成功与否),并以一个包含每个Promise结果的对象数组的形式返回。

使用Promise.all时,如果你希望在任何一个Promise被拒绝时立即中断执行并处理错误,你可以结合使用.catch方法来捕获错误。而对于Promise.allSettled,你可以在最后统一处理每个Promise的结果,无论成功与否。

// 创建三个使用 axios 发送请求的 promise
let p1 = axios.get("https://jsonplaceholder.typicode.com/todos/1");
let p2 = axios.get("https://jsonplaceholder.typicode.com/todos/2");
let p3 = axios.get("https://jsonplaceholder.typicode.com/todos/3");

使用 Promise.all 或 Promise.allSettled 等待所有的 promise 完成,并处理结果:

// 使用 Promise.all 等待所有的 promise 完成
Promise.all([p1, p2, p3])
  .then((results) => {
    // results 是 [{status: 200, data: {...}}, 
    // {status: 200, data: {...}}, 
    // {status: 200, data: {...}}]
    console.log(results); // 打印结果数组
    // 可以对每个结果进行处理,比如打印数据
    results.forEach((result) => {
      console.log(result.data);
    });
  })
  .catch((error) => {
    // 如果有一个 promise 失败,就会进入这里,并打印失败原因
    console.error(error);
  });

// 使用 Promise.allSettled 等待所有的 promise 完成
Promise.allSettled([p1, p2, p3]).then((results) => {
  // results 是 [{status: "fulfilled", value: {status: 200, data: {...}}}, 
  // {status: "fulfilled", value: {status: 200, data: {...}}}, 
  // {status: "fulfilled", value: {status: 200, data: {...}}}]
  console.log(results); // 打印结果数组
  // 可以对每个结果进行处理,比如根据状态判断是否成功
  results.forEach((result) => {
    if (result.status === "fulfilled") {
      // 如果成功,打印数据
      console.log(result.value.data);
    } else {
      // 如果失败,打印失败原因
      console.error(result.reason);
    }
  });
});
Promise.allPromise.allSettled是两种不同的Promise方法,它们在使用场景返回结果上有所不同。 1. Promise.all: - 使用场景:当需要等待多个Promise对象都完成后再执行后续操作时,可以使用Promise.all。 - 返回结果:返回一个新的Promise对象,Promise对象在所有给定的Promise对象都已经fulfilled后才会fulfilled,如果其中任何一个Promise对象被rejected,则返回的Promise对象会立即被rejected。 - 示例代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[1, 2, 3] }) .catch(error => { console.log(error); // 如果有任何一个Promise对象被rejected,则会执行这里的代码 }); ``` 2. Promise.allSettled: - 使用场景:当需要等待多个Promise对象都完成后,无论是fulfilled还是rejected,都需要获取每个Promise对象的结果时,可以使用Promise.allSettled。 - 返回结果:返回一个新的Promise对象,该Promise对象在所有给定的Promise对象都已经fulfilled或rejected后才会fulfilled,返回的Promise对象带有一个对象数组,每个对象表示对应的Promise对象的结果,包括状态(fulfilled或rejected)值。 - 示例代码: ```javascript const apiOne = function(id) { return new Promise((resolve, reject) => { resolve({ result: true, text: 1 }); }); }; const apiTwo = function(id) { return new Promise((resolve, reject) => { reject({ result: true, text: 2 }); }); }; Promise.allSettled([apiOne('one'), apiTwo('two')]) .then(results => { console.log(results); /* 输出: [ { status: 'fulfilled', value: { result: true, text: 1 } }, { status: 'rejected', reason: { result: true, text: 2 } } ] */ }) .catch(error => { console.log(error); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值