Promise.allSettled 是推荐方案,它等待所有 Promise 结束并返回每个的状态和结果,不因单个失败而丢弃其他数据;旧环境可用 safe 包装函数统一处理成功与失败。

Promise.all 默认“全成功才成功”,只要一个失败就整体拒绝,丢失所有已成功的数据。要安全保留部分成功结果,核心思路是:让每个 Promise 都不真正抛出错误,而是把成功和失败都转为“成功返回”的结构(比如 { data, error }),再统一处理。
用 Promise.allSettled 替代(推荐,现代方案)
Promise.allSettled 是 ES2020 引入的原生方法,它会等待所有 Promise 结束(无论 fulfilled 还是 rejected),并返回每个 Promise 的状态和结果,完全保留所有数据。
- 每个结果都是对象:
{ status: 'fulfilled', value }或{ status: 'rejected', reason } - 不会因某个失败而中断或丢弃其他结果
- 适合需要“尽力而为”且必须知道每个请求成败的场景
const promises = [
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/config').then(r => r.json())
];
Promise.allSettled(promises).then(results => {
const successes = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);
const failures = results
.filter(r => r.status === 'rejected')
.map(r => r.reason);
console.log('成功数据:', successes);
console.log('失败原因:', failures);
});
手动包装 Promise(兼容旧环境)
若需支持较老浏览器或 Node.js 版本(
- 用
.then(...).catch(...)捕获错误,统一返回 { data, error } - 确保每个包装后的 Promise 总是 resolve,避免触发 Promise.all 的短路逻辑
function safe(p) {
return p
.then(data => ({ data, error: null }))
.catch(error => ({ data: null, error }));
}
const promises = [
safe(fetch('/api/user').then(r => r.json())),
safe(fetch('/api/posts').then(r => r.json())),
safe(fetch('/api/config').then(r => r.json()))
];
Promise.all(promises).then(results => {
const successes = results.filter(r => r.error === null).map(r => r.data);
const errors = results.filter(r => r.error !== null).map(r => r.error);
console.log('拿到的成功数据:', successes);
console.log('捕获的错误:', errors);
});
按需提取与后续处理
保留数据只是第一步,实际使用中常需进一步判断哪些结果可用、是否降级、是否重试:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
立即学习“Java免费学习笔记(深入)”;
- 对 success 数组做空值/结构校验(例如检查
user?.id) - 对 error 数组分类处理:网络错误可重试,404 可跳过,500 可告警
- 关键数据缺失时提供默认值或 fallback UI,非关键数据缺失则静默忽略
不建议的做法
以下方式看似简单,但有隐患:
- 在 Promise.all 外层 try/catch:只能拿到第一个失败原因,其余 Promise 状态未知,且无法获取已 resolve 的值(因为 Promise.all 已 reject,未提供中间状态)
- 用 Promise.all + 单个 .catch 后再手动重新发起请求:破坏并发性,增加延迟,且可能重复触发副作用(如多次提交)
- 用多个独立 await:失去并行优势,总耗时变成累加而非取最大值

















