Promise.all 和 Promise.allSettled

本文将探讨处理多个Promise的方法:Promise.all 与 Promise.allSettled 之间的区别以及何时使用它们。

1. Promise.all:高期望

Promise.all 是一种广泛使用的方法,它接受一个 Promise 数组,并返回一个新的 Promise。当数组中的所有 Promise 都成功时,新的 Promise 也成功;当数组中的任何一个 Promise 失败时,新的 Promise 就会失败。换句话说,它期望所有 Promise 要么成功,要么失败,然后根据情况提供一个结果。

让我们来看一个示例:

javascript 复制代码
const promises = [

  fetch('https://api.example.com/data1'),

  fetch('https://api.example.com/data2'),

  fetch('https://api.example.com/data3'),

];

  


Promise.all(promises)

  .then((results) => {

    // 处理成功的结果

  })

  .catch((error) => {

    // 处理任何错误

  });

在这个示例中,如果任何请求失败,整个Promise.all都会失败,并且你需要在catch块中处理错误。

2. Promise.allSettled:接受现实

与此不同,Promise.allSettled 是 JavaScript Promise API 的较新添加。它也接受一个 Promise 数组,但不会在任何 Promise 拒绝时中断。相反,它会等待所有 Promise 都 "settled"(无论是成功还是失败),并返回一个包含每个 Promise 结果的对象数组。

下面是如何使用Promise.allSettled:

javascript 复制代码
const promises = [

  fetch('https://api.example.com/data1'),

  fetch('https://api.example.com/data2'),

  fetch('https://api.example.com/data3'),

];

  


Promise.allSettled(promises)

  .then((results) => {

    results.forEach((result) => {

      if (result.status === 'fulfilled') {

        // 处理成功的结果

        console.log('已完成:', result.value);

      } else {

        // 处理错误

        console.log('已拒绝:', result.reason);

      }

    });

  });

在这个示例中,即使某些Promise被拒绝,Promise.allSettled仍然会成功,并提供有关每个Promise状态的信息。这在你需要独立了解每个Promise的结果(无论成功或失败)时非常有用。

3. 何时使用

  1. Promise.all: 当你需要所有的 Promise 都成功才能被认为是成功操作,如果有一个 Promise 失败,就中止整个操作。

  2. Promise.allSettled: 当你希望等待所有Promise完成,并需要知道每个Promise的结果,无论成功与否。这在需要单独报告每个 Promise 的状态时非常有用。

4. 总结

Promise.all 和 Promise.allSettled 都是处理多个Promise 的强大工具,选择取决于具体的使用情况,以及是否需要一刀切的行为(Promise.all)或需要单独处理每个 Promise 的结果(Promise.allSettled)。

希望本文对您有所帮助!

相关推荐
用户0044729538259 小时前
练歌镜:让眼镜听懂“循环这一句”
javascript
yuyuxun111 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
总要学点什么15 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Agent世界16 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
总要学点什么16 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
程序员大阳16 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半17 小时前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳17 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
曦樂~18 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
码云社区19 小时前
智慧物业系统选型指南:房屋档案、账单管理与报修协作
前端·javascript·vue.js·智慧物业