promise.any() 返回第一个成功promise的结果,全部失败时抛出含errors数组的aggregateerror;它不取消其余promise,需手动处理资源清理,es2021新增,旧环境需polyfill。

Promise.any() 用于等待一组 Promise 中第一个成功(fulfilled)的结果,只要有一个成功就立即返回该结果;如果全部失败,则抛出一个 AggregateError(包含所有拒绝原因的错误对象)。
基本用法:传入 Promise 数组
它接收一个可迭代对象(通常是数组),每个元素应是 Promise 或 thenable 对象:
const p1 = new Promise(resolve => setTimeout(() => resolve('快'), 100));
const p2 = new Promise((_, reject) => setTimeout(() => reject('慢且失败'), 200));
const p3 = new Promise(resolve => setTimeout(() => resolve('中等'), 150));
Promise.any([p1, p2, p3])
.then(value => console.log(value)) // 输出:'快'
.catch(err => console.error(err)); // 全部失败时才进入这里
注意:失败的 Promise 不会中断执行,只被忽略
Promise.any() 会持续监听所有 Promise,但一旦有任意一个 fulfilled,就立刻 resolve,其余仍在运行的 Promise 不会被取消(JS 没有原生取消机制,需手动处理或使用 AbortController 配合):
- 未完成的 Promise 仍可能后续触发 reject 或 fulfill,但其结果被丢弃
- 若你依赖资源清理(如 fetch 请求),需自行管理 abort 逻辑
处理全部失败的情况:捕获 AggregateError
当所有 Promise 都 rejected 时,Promise.any() 返回的 Promise 会以 AggregateError reject。它有一个 errors 属性,是所有拒绝原因的数组:
Promise.any([
Promise.reject('error A'),
Promise.reject('error B')
])
.catch(err => {
console.log(err instanceof AggregateError); // true
console.log(err.errors); // ['error A', 'error B']
});
兼容性与替代方案
Promise.any() 是 ES2021 新增特性,现代浏览器和 Node.js 15+ 原生支持。如需兼容旧环境:
- 使用 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));
}
});
});
});
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











