Promise.any返回首个成功Promise的值,全部失败时抛出含errors数组的AggregateError;与race不同,它只对成功响应“抢”,忽略单个失败。

Promise.any 用于处理“只要有一个 Promise 成功,就立即返回其结果”的场景,适合容错型并发请求(比如从多个备用接口中取最快响应的数据)。
基本用法:传入 Promise 数组,返回首个成功的值
Promise.any 接收一个 Promise 实例数组,一旦其中任意一个 fulfilled(成功),就立刻以该值 resolve;如果全部 rejected(失败),则抛出 AggregateError 错误。
- 它不关心其他 Promise 是否还在运行,也不等待它们结束
- 和 Promise.race 不同:race 对成功和失败都“抢”,any 只对成功“抢”,失败会被忽略(除非全失败)
- 和 Promise.all 不同:all 要求全部成功才 resolve,any 只要一个成功就行
典型使用场景示例
比如调用多个镜像 API 获取同一份数据,选最快返回的:
const fetchFromA = () => fetch('https://api-a.example/data').then(r => r.json());
const fetchFromB = () => fetch('https://api-b.example/data').then(r => r.json());
const fetchFromC = () => fetch('https://api-c.example/data').then(r => r.json());
Promise.any([fetchFromA(), fetchFromB(), fetchFromC()])
.then(data => console.log('拿到数据:', data))
.catch(err => {
// 注意:err 是 AggregateError 类型,包含所有 rejection 原因
console.error('全部请求失败:', err.errors);
});
注意错误处理:AggregateError 的结构
当所有 Promise 都 rejected 时,Promise.any 拒绝的是一个 AggregateError 实例,它的 errors 属性是一个数组,按顺序保存了每个 Promise 的 rejection 原因。
立即学习“Java免费学习笔记(深入)”;
- 不能直接用
err.message判断具体原因,要遍历err.errors - 可以配合
Array.from(err.errors).some(...)做条件判断 - 若需兼容旧环境(如 Node.js <16 或老版浏览器),可用 polyfill 或手动实现简易版
与 Promise.race 的关键区别(易混淆点)
假设三个 Promise 分别是:Promise.resolve(1)、Promise.reject('timeout')、Promise.reject('network'):
-
Promise.race([...])→ 立即 reject,因为 reject 发生得比 resolve 快(取决于执行顺序) -
Promise.any([...])→ resolve(1),因为存在一个成功项,其余失败被忽略 - 再换一种情况:全为 reject → race 和 any 都会 reject,但 race 的 error 就是第一个 reject 值,any 的 error 是 AggregateError


















