Promise.all 与 Promise.allSettled:一次取数的小差别,救了我的接口

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我

引子

同时并发调用一堆 API,既迅速优雅 。把所有请求塞进 Promise.all,点一下部署,你会觉得自己就是 JavaScript 摇滚明星。 然而,一个细小的失败就足以拖垮全局------我就亲历了这场事故。

这篇文章会把 Promise.allPromise.allSettled 的关键差异讲清楚,并解释我如何因为切换到后者,躲过了一次"无声灾难"。

场景设定

我在做一个仪表盘,需要从多个微服务并发拉数据:

go 复制代码
const [user, orders, notifications] = await Promise.all([
  getUser(),
  getOrders(),
  getNotifications(),
]);

一切都很顺利------直到某个接口开始间歇性失败 。 当其中任意一个 Promise 拒绝时,整组调用立刻崩溃:没有兜底、没有部分数据、只有报错。

轮到 Promise.allSettled 登场

与"有一个失败就整体拒绝 "的 Promise.all 不同,Promise.allSettled 会等全部 Promise 结束,并返回每一项的状态与结果/原因。

go 复制代码
const results = await Promise.allSettled([
  getUser(),
  getOrders(),
  getNotifications(),
]);

results.forEach(result => {
  if (result.status === 'fulfilled') {
    console.log('Success:', result.value);
  } else {
    console.warn('Failed:', result.reason);
  }
});

这样我就可以:

  • 渲染部分数据(谁成功就先展示谁);

  • 标注失败模块(告诉用户哪个小部件挂了);

  • 有选择地重试(只重试失败的那几项)。

因此,应用的韧性 更强,用户体验也更友好 。尽管如此,要注意状态分支处理更细,代码上需要明确区分 fulfilled / rejected;与此同时,日志与监控也要跟上,避免悄悄失败。

要点小结

  • Promise.all:只要有一个失败立刻 reject,其余结果不再等待。

  • Promise.allSettled全部等待 完成,返回每一项{ status, value | reason }

  • 使用建议

    • 所有步骤必须成功 (如登录流程的多步校验、事务性写入)→ 用 **Promise.all**,失败要尽快中断。

    • 允许部分失败 (如仪表盘多部件、侧边小组件、可降级内容加载)→ 用 **Promise.allSettled**,容错更合适。

进一步的实战提示

  1. 选择性重试

    go 复制代码
    const results = await Promise.allSettled(tasks);
    const failed = results
      .map((r, i) => [r, i])
      .filter(([r]) => r.status === 'rejected')
      .map(([, i]) => tasks[i]);
    
    if (failed.length) {
      // 退避重试或队列重放
      await Promise.allSettled(failed.map(backoffRetry));
    }
  2. 保持响应可用 即使部分失败,也返回带缺口的 UI(骨架屏/占位符),并附带"刷新/重试"入口,因此用户不会看到空白或整页报错。

  3. 区分"硬必需"与"软可选" 把关键数据(必须成功)与附加数据(可失败)拆分 ,前者走 Promise.all,后者走 Promise.allSettled,从而保证核心路径确定性

✅ 结语

JavaScript 给了我们强大的并发原语;在恰当时机选用恰当工具 ,才是高级开发者的分水岭。 如果你的应用频繁并行请求、或依赖并不稳 的端点,不妨试试 Promise.allSettled------也许它也会拯救你的 API

全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

最后:

Vue 设计模式实战指南

20个前端开发者必备的响应式布局

深入React:从基础到最佳实践完整攻略

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

相关推荐
HDO清风3 分钟前
CASIA-HWDB2.x 数据集DGRL文件解析(python)
开发语言·人工智能·pytorch·python·目标检测·计算机视觉·restful
2201_756989094 分钟前
C++中的事件驱动编程
开发语言·c++·算法
会飞的战斗鸡9 分钟前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
多米Domi01115 分钟前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
2301_8223776515 分钟前
模板元编程调试方法
开发语言·c++·算法
csbysj202019 分钟前
Python 循环嵌套
开发语言
测试_AI_一辰21 分钟前
Agent & RAG 测试工程05:把 RAG 的检索过程跑清楚:chunk 是什么、怎么来的、怎么被命中的
开发语言·人工智能·功能测试·自动化·ai编程
Coding茶水间24 分钟前
基于深度学习的输电电力设备检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
清风~徐~来28 分钟前
【视频点播系统】BRpc 介绍及使用
开发语言
啟明起鸣29 分钟前
【C++ 性能提升技巧】C++ 的引用、值类型、构造函数、移动语义与 noexcept 特性,可扩容的容器
开发语言·c++