promise.any() 返回第一个成功的promise结果,仅当全部失败时才以aggregateerror拒绝;与race()不同,它忽略失败、只等待首个fulfilled。

Promise.any() 专门用于从多个 Promise 中“抢”出第一个成功(fulfilled)的结果,只要有一个成功就立即返回,忽略其他仍在进行或失败的 Promise。
基本用法:传入 Promise 数组,返回最快成功的值
它接收一个 Promise 实例数组,返回一个新的 Promise:
- 只要其中任意一个 Promise 成功,新 Promise 就以该结果 fulfilled,并不再等待其余 Promise;
- 只有当所有 Promise 都 rejected 时,新 Promise 才会 rejected(此时抛出
AggregateError)。
示例:
Promise.any([fetch('/api/user').then(r => r.json()),
fetch('/api/cache').then(r => r.json()),
new Promise(resolve => setTimeout(() => resolve({ cached: true }), 50))
])
.then(result => console.log('最快拿到的数据:', result))
.catch(err => console.error('全部失败了:', err));
注意 reject 的处理:不是“忽略错误”,而是“全失败才报错”
Promise.any() 不会因单个 Promise 失败而中断或报错。它会默默跳过失败项,继续等待其他 Promise 的状态变化。只有当所有输入 Promise 都进入 rejected 状态,才会触发 catch 分支,并传入一个 AggregateError 对象(包含所有 rejection 原因)。
如果你只关心“有没有成功”,可以不写 catch;但建议至少捕获全失败的情况,避免静默失败:
Promise.any(promises).then(data => use(data))
.catch(err => {
if (err instanceof AggregateError) {
console.warn('所有请求都失败了,降级处理');
useFallback();
}
});
和 Promise.race() 的关键区别
- Promise.race() 是“谁先定谁说了算”——无论成功还是失败,第一个 settle 的 Promise 决定结果;
- Promise.any() 是“只认成功”——只等第一个 fulfilled,失败的全当不存在,除非全部失败。
比如三个 Promise:一个 100ms 后 reject,一个 200ms 后 resolve,一个 300ms 后 resolve。
→ race() 会在 100ms 后 rejected;
→ any() 会在 200ms 后 fulfilled,返回第二个的结果。
兼容性与降级方案
Promise.any() 在现代浏览器和 Node.js 16+ 中原生支持,但旧环境需 polyfill 或手动实现:
function promiseAny(promises) {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));
}
});
});
});
}
实际项目中推荐使用 core-js 或直接引入 promise-polyfill 的 any 方法。










