promise.any 的 catch 捕获的是 aggregateerror,而非单个 promise 的错误。当所有传入的 promise 都拒绝时,catch 会接收到一个包含所有拒绝原因的数组(通过 errors 属性访问)。

如何获取被拒绝的具体原因
在 catch 块中,错误对象是 AggregateError 实例。你需要检查其 errors 属性来获取每个失败 Promise 的原始拒绝值。这个属性是一个数组,顺序与输入 Promise 的顺序一致。

const promises = [
Promise.reject(new Error('Fail 1')),
Promise.reject(new Error('Fail 2'))
];
Promise.any(promises)
.then(result => console.log('Success:', result))
.catch(err => {
if (err instanceof AggregateError) {
console.log('All failed. Errors:', err.errors);
// err.errors is an array of rejection reasons
} else {
console.error('Unexpected error:', err);
}
});
运行上述代码将输出:
All failed. Errors: [ Error: Fail 1, Error: Fail 2 ]
如何处理单个错误并继续
如果你需要区分哪个 Promise 失败了,或者想根据具体错误类型做不同处理,可以遍历 AggregateError 的 errors 数组。这允许你针对每个拒绝原因执行特定的逻辑,例如重试或记录日志。

const promises = [
Promise.reject(new TypeError('Type Error')),
Promise.reject(new ReferenceError('Ref Error'))
];
Promise.any(promises)
.catch(err => {
if (err instanceof AggregateError) {
err.errors.forEach((e, index) => {
if (e instanceof TypeError) {
console.log(`Promise ${index} had a type error`);
} else if (e instanceof ReferenceError) {
console.log(`Promise ${index} had a ref error`);
}
});
}
});
AggregateError 的结构特征是什么
AggregateError 是 ES2021 引入的标准错误类型,专门用于聚合多个错误。它有两个主要属性:message 提供摘要信息,errors 提供完整的错误列表。在浏览器和 Node.js 环境中,AggregateError 的行为一致,确保你可以可靠地访问 errors 数组。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











