Promise.all 默认短路,首个失败即 reject 并丢弃其余结果;应优先用 Promise.allSettled 实现全量状态收集,或手动包装 Promise 为始终 resolve 的对象以兼容 all。

Promise.all 默认只要有一个 Promise 失败,就立即 reject,且只返回第一个失败的原因,其余未完成的 Promise 会被丢弃(或继续执行但结果不可见)。它不会等所有 Promise 都结束才汇总错误,所以“全部失败捕获”不能靠原生 Promise.all 直接实现。
用 Promise.allSettled 替代(推荐)
Promise.allSettled 是专门为此设计的:它等待所有 Promise 结束(无论 fulfilled 还是 rejected),并返回每个 Promise 的状态和结果/原因。
- 每个结果是对象:
{ status: 'fulfilled', value }或{ status: 'rejected', reason } - 可轻松筛选出所有失败项:
results.filter(r => r.status === 'rejected') - 兼容性好(现代浏览器和 Node.js 12.9+ 原生支持)
const promises = [
Promise.reject('API 1 failed'),
Promise.reject('API 2 failed'),
Promise.resolve('success')
];
Promise.allSettled(promises).then(results => {
const rejections = results
.filter(r => r.status === 'rejected')
.map(r => r.reason);
console.log('所有失败原因:', rejections);
// ['API 1 failed', 'API 2 failed']
});
手动包装 Promise 实现“全量捕获”
如果必须用 Promise.all(比如依赖库强制要求返回 Promise.all),可提前将每个 Promise 包装成“永不 reject”的形式,例如用 .catch(e => ({ error: e })),再在后续统一判断。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 每个 Promise 转为 resolve 一个带 success/error 字段的对象
- Promise.all 不会中断,最终拿到全部结果
- 适合需要保持 Promise.all 行为但又不想丢失错误信息的场景
const safePromises = promises.map(p =>
p.then(value => ({ success: true, value }))
.catch(error => ({ success: false, error }))
);
Promise.all(safePromises).then(results => {
const failures = results.filter(r => !r.success);
if (failures.length > 0) {
console.error('共失败', failures.length, '个:', failures.map(f => f.error));
}
});
注意:Promise.all 并不“忽略”失败,而是“短路”
很多人误以为 Promise.all 会静默吞掉失败,其实它只是拒绝得早、只暴露第一个错误。剩余 Promise 仍可能在后台运行(尤其含副作用时),但它们的 resolve/reject 不再影响 Promise.all 返回的 Promise 状态。
立即学习“Java免费学习笔记(深入)”;
- 若需取消未完成的请求,应配合 AbortController 等机制主动中止
- 不要依赖 Promise.all 来“收集所有错误”,那是语义错配
- allSettled 是更语义清晰、行为确定的替代方案

















