promise.allsettled 可实现容错并发:全部请求并发发出、各自独立完成、统一返回含 status/value 或 reason 的结果数组,支持按状态分类渲染与错误提示,避免未处理 rejection。

async-await 本身不处理并发错误聚合,但配合 Promise.allSettled 可以实现“全部请求发出去、各自独立完成、统一收集结果(含成功/失败)、按需渲染”的效果。关键在于:不中断执行、区分状态、避免未处理的 rejected promise 报错。
用 allSettled 替代 all 实现容错并发
Promise.all 遇到任一 reject 就整体失败,而 Promise.allSettled 总是返回一个数组,每个元素带 status: 'fulfilled' | 'rejected' 和对应 value 或 reason。这样你就能知道哪个接口挂了、为什么挂,而不影响其他数据渲染。
- 把多个 API 调用包装成 Promise 数组,直接传给
allSettled - await 后得到结构统一的结果数组,遍历即可分类处理
- 注意:即使某个请求 401 或网络超时,也不会抛出未捕获异常,无需额外 try-catch 包裹 each
在 async 函数中组织请求与结果解析
典型写法是先并发发起所有请求,再统一解构响应。建议封装一个工具函数来标准化处理逻辑:
async function fetchMultiple() {
const promises = [
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/stats').then(r => r.json())
];
const results = await Promise.allSettled(promises);
return results.map((result, index) => ({
id: ['user', 'posts', 'stats'][index],
...result
}));
}
返回值形如:[{id:'user', status:'fulfilled', value:{...}}, {id:'posts', status:'rejected', reason:Error}, ...],后续可直接映射到 UI 状态。
按状态驱动部分渲染与错误提示
拿到 allSettled 结果后,不必等全部成功才更新 UI。可以分三类处理:
-
fulfilled:提取
value渲染对应模块(如用户头像、文章列表) -
rejected:检查
reason类型(NetworkError / 4xx / 5xx),显示轻量级提示(如“动态加载失败,点击重试”),保留已有内容 - 对关键模块(如登录态)设 fallback 值或 loading 占位,非关键模块允许空白或 error state
避免常见陷阱
几个容易忽略但影响体验的细节:
- fetch 默认不带 credentials,跨域请求可能静默失败,记得加
{ credentials: 'include' } - allSettled 不会取消请求,若页面卸载时还在 pending,需用 AbortController 主动 abort(尤其长耗时接口)
- 不要在 map 中直接 await 某个 fulfilled 结果——它已是 resolved 值,直接取
result.value即可 - 服务端返回 4xx/5xx 时 fetch 不自动 reject,需手动检查
response.ok并 throw,否则 allSettled 会当成 fulfilled 处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











