Promise.any返回首个成功Promise的值,全部失败时抛出AggregateError;与Promise.race不同,它只响应成功结果,忽略失败;适用于多源取最快响应场景,需配合超时控制防止单个Promise挂起。

Promise.any 会等待所有 Promise 中第一个成功(fulfilled)的结果,并立即返回该值;如果全部失败,则抛出一个 AggregateError(包含所有拒绝原因的错误集合)。
基本用法:拿到首个成功的响应
适用于“多个数据源中取最快可用结果”的场景,比如同时请求多个镜像 API、备用服务或缓存+网络双通道:
- 传入一个 Promise 实例数组
- 只要有一个 resolve,
Promise.any就立刻 resolve 那个值 - 全部 reject 才 reject,且错误是
AggregateError类型
示例:
fetch('/api/v1/data').then(r => r.json()),
fetch('/api/v2/data').then(r => r.json()),
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 500))
])
.then(result => console.log('首个成功结果:', result))
.catch(err => {
if (err instanceof AggregateError) {
console.error('全部失败:', err.errors);
} else {
console.error('其他错误:', err);
}
});
注意点:和 Promise.race 的区别
Promise.any 只关心“成功”,忽略失败;而 Promise.race 是“谁先完成谁胜出”,无论成功或失败:
-
Promise.race([p1, p2]):如果 p1 立即 reject,整个 race 就立刻 reject -
Promise.any([p1, p2]):即使 p1 reject,只要 p2 后续 resolve,结果就是 p2 的值
兼容性与降级方案
目前主流浏览器和 Node.js 16+ 原生支持 Promise.any。如需兼容旧环境,可手动实现简易版(不处理 AggregateError 细节,仅满足“首个成功”逻辑):
return new Promise((resolve, reject) => {
const errors = [];
let rejectedCount = 0;
promises.forEach(p => {
Promise.resolve(p).then(resolve).catch(err => {
errors.push(err);
if (++rejectedCount === promises.length) {
reject(new AggregateError(errors, 'All promises were rejected'));
}
});
});
});
}
实用技巧:配合超时控制更可靠
单独用 Promise.any 不能防止单个 Promise 永远不结束。建议给每个任务加超时包装:
return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error(msg)), ms)
),
 ]);
}
Promise.any([
withTimeout(fetch('/fast'), 1000),
withTimeout(fetch('/slow'), 1000),
]).then(...);


















