promise.allsettled 是处理并行请求“尽力而为”需求的首选方案,它返回每项的完整状态(fulfilled/rejected),便于区分成功与失败;次选是用 catch 包装各 promise 后配合 promise.all;还可结合重试或降级提升韧性。

Promise.all 的“一票否决”机制不是缺陷,而是设计使然——它适合需要全部成功才推进流程的场景。但多数真实业务(比如并行加载用户资料、订单、通知)更需要“尽力而为”:失败的不拖累成功的,还要知道谁失败了、为什么失败。应对方式有三种主流路径,按推荐度和适用性排列如下:
用 Promise.allSettled 获取每项的完整状态
这是最直接、语义最清晰的解法,ES2020 起原生支持,现代浏览器和 Node.js 12.9+ 均可用。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 它不关心成败,只等所有 Promise 结束,返回固定结构数组:
{ status: 'fulfilled', value: ... }或{ status: 'rejected', reason: ... } - 你可以轻松区分成功项与失败项,并分别处理:
✅ 成功数据直接渲染
❌ 失败项记录错误、标记重试按钮、上报监控 - 示例代码:
fetch('/api/user'),
fetch('/api/orders'),
fetch('/api/notifications')
]);
results.forEach((res, i) => {
if (res.status === 'fulfilled') {
console.log(`接口 ${i} 成功`, res.value);
} else {
console.warn(`接口 ${i} 失败`, res.reason);
}
});
用 catch 包装每个 Promise,再走 Promise.all
当环境不支持 allSettled(如旧版 IE 或极老 Node),或你只想保留成功值、彻底忽略失败时,可手动“兜底”每个 Promise。
- 核心技巧:对每个 Promise 调用
.catch(() => undefined)或.catch(err => ({ error: err })),让它始终 resolve - 这样 Promise.all 就不会中断,最终得到的数组里,失败项是
undefined或自定义错误对象,成功项是原始值 - 注意:这种方式丢失了原生 reject 的堆栈和类型信息,调试稍弱;若需错误详情,建议返回带字段的对象而非
undefined
按需组合:失败后自动重试或降级
单纯拿到失败结果还不够?有些场景要求更强韧性,比如图片加载、第三方 API 调用。
- 可在 allSettled 后筛选出失败项,构造新 Promise 数组重发(限制次数,避免雪崩)
- 也可在单个请求中内置重试逻辑(如用
async/await + for 循环 + delay),再把它们传给 allSettled - 对非关键数据,还可设置降级值:失败时返回默认头像、空列表、缓存快照等,保证 UI 不空白










