Promise 提供 all、allSettled、race 和 any 四种静态方法聚合多个 Promise:all 要求全成功才 resolve;allSettled 返回每个 Promise 的终态;race 返回首个 settled 结果;any 返回首个 fulfilled 结果,全失败才 reject。

Promise 本身不直接“合并”多个异步实例的状态,但可以通过 Promise.all、Promise.race、Promise.allSettled 和 Promise.any 这四种静态方法,按不同逻辑聚合多个 Promise 实例的结果。
用 Promise.all 实现全成功才 resolve
当所有 Promise 都 fulfilled 时,返回一个包含全部结果的数组;只要有一个 rejected,整个就立即 reject(短路)。
- 适合“全部请求必须成功”的场景,比如同时加载多个配置文件
- 结果顺序与传入顺序严格一致,不管哪个先完成
- 注意:如果某个 Promise 抛错或被 reject,后续 Promise 仍会执行(只是你不等它了)
const p1 = fetch('/api/user');
const p2 = fetch('/api/profile');
const p3 = fetch('/api/settings');
Promise.all([p1, p2, p3])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([user, profile, settings]) => {
console.log({ user, profile, settings });
})
.catch(err => console.error('任一请求失败', err));
用 Promise.allSettled 获取每个 Promise 的最终状态
无论 fulfilled 还是 rejected,都会等待所有 Promise 结束,并返回每个结果的对象数组,含 status、value 或 reason 字段。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 适合“容错聚合”,比如批量提交表单、上报日志,需要知道每个子任务成败
- 不会因某个失败而中断,也不抛异常,始终 resolve
- 可用于统计成功率、筛选成功项、汇总错误原因
const requests = [
fetch('/api/submit1'),
fetch('/api/submit2').then(() => { throw new Error('timeout') }),
fetch('/api/submit3')
];
Promise.allSettled(requests)
.then(results => {
const successes = results.filter(r => r.status === 'fulfilled');
const failures = results.filter(r => r.status === 'rejected');
console.log(`成功 ${successes.length} 个,失败 ${failures.length} 个`);
});
用 Promise.race 或 Promise.any 响应最快结果
race 返回第一个 settled(fulfilled 或 rejected)的 Promise 结果;any 等待第一个 fulfilled,只有全部 rejected 才 reject(带 AggregateError)。
立即学习“Java免费学习笔记(深入)”;
-
race常用于设置超时:和一个定时 reject 的 Promise 一起 race -
any适用于“只要一个可用即可”的场景,比如多 CDN 资源加载、备用接口兜底 - 两者都不关心其余 Promise 的状态,它们继续运行但结果被忽略
function timeout(ms) {
return new Promise((_, reject) =>
setTimeout(() => reject(new Error('timeout')), ms)
);
}
Promise.race([
fetch('/api/data'),
timeout(5000)
])
.then(data => data.json())
.catch(err => console.error('请求超时或失败:', err));
手动组合多个 Promise 状态(进阶)
若需自定义合并逻辑(如:成功数 ≥ 2 才 resolve,或收集前两个成功结果),可封装函数,利用 Promise.resolve + then + 计数器或数组暂存实现。
- 核心思路:用变量记录各 Promise 的结果,通过
then/catch分别处理每个 Promise 的 settled 状态 - 避免直接用
Promise.all,改用Promise.allSettled后再做业务判断更清晰 - 注意错误边界:确保每个 Promise 的异常被捕获,否则可能静默失败
function atLeastTwoSuccess(promises) {
return Promise.allSettled(promises).then(results => {
const fulfilled = results.filter(r => r.status === 'fulfilled').map(r => r.value);
if (fulfilled.length >= 2) return fulfilled.slice(0, 2);
throw new Error(`仅 ${fulfilled.length} 个成功,不足两个`);
});
}

















