Promise.race返回第一个完成(fulfilled或rejected)的Promise结果,适用于竞速场景;若首个完成的是rejected,则立即reject,其余结果被忽略。

Promise.race 会等待所有 Promise 中**第一个完成(fulfilled 或 rejected)的**,并立即返回它的结果。它适合“竞速”场景,比如同时调用多个接口,只取响应最快的那一个。
基本用法:传入 Promise 数组
把多个异步操作(如 fetch 请求)包装成 Promise,放进数组传给 Promise.race():
const api1 = fetch('/api/slow').then(r => r.json());
const api2 = fetch('/api/fast').then(r => r.json());
const api3 = fetch('/api/medium').then(r => r.json());
Promise.race([api1, api2, api3])
.then(result => console.log('最快的结果:', result))
.catch(error => console.error('最快的那个失败了:', error));
注意:只要有一个 Promise 完成(无论成功或失败),race 就立刻结束,其余仍在运行但结果被忽略。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见问题与处理技巧
-
失败也会触发 race 结束:如果最快的那个请求出错了(如网络超时、404),
.catch()会捕获它,而不是等其他成功的请求。需要在每个 Promise 内部提前处理错误,或用.catch(() => {...})把失败转为默认值。 - 想忽略失败、只等第一个成功? 可以封装一个“安全版 race”:
function firstSuccess(promises) {
return Promise.race(
promises.map(p => p.catch(err => ({ error: true, value: err })))
).then(res => {
if (res?.error) throw res.value;
return res;
});
}
这样即使某个请求失败,也不会让整个 race 立即 reject,而是继续等其他成功结果。
立即学习“Java免费学习笔记(深入)”;
实用场景举例
- 多 CDN 接口容灾:同一数据从不同域名获取,选最快可用的。
-
带超时控制的请求:和
setTimeout包装的 Promise 一起 race,实现自定义超时:
function timeout(ms, promise) {
return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('请求超时')), ms)
)
]);
}
timeout(3000, fetch('/api/data').then(r => r.json()))
.then(data => console.log(data))
.catch(err => console.error(err.message)); // 超时或请求失败都走这里
和 Promise.all、Promise.any 的区别
-
Promise.all:必须全部成功才 resolve;任一失败就 reject。 -
Promise.any:等待第一个成功,失败会被忽略,全失败才 reject(ES2021+)。 -
Promise.race:不区分成功失败,谁先完成谁胜出。
所以,明确要“只取最先返回(不管成败)”时用 race;要“取最先成功的”且环境支持,Promise.any 更语义清晰。

















