promise.race() 返回第一个settled的promise结果,无论fulfilled或rejected;常用于超时控制,但失败也会“胜出”,若只需首个成功结果应使用promise.any()。

Promise.race() 用于并行执行多个 Promise,并立即返回第一个 settled(完成或失败)的结果,无论它是 fulfilled 还是 rejected。
核心行为:谁快谁先出,不等别人
不同于 Promise.all() 要等全部成功,race() 只看“时间”,不看状态。只要有一个 Promise 结束(成功或失败),整个 race 就立刻结束,返回那个结果。
- 如果第一个 settled 的是
resolve(10),那race就以10fulfilled - 如果第一个 settled 的是
reject(new Error('timeout')),那race就直接 rejected - 其余还在 pending 的 Promise 不会自动取消(需手动清理,比如 abort controller)
典型用法:超时控制
最常见的场景是给异步操作加超时限制:
function fetchWithTimeout(url, timeout = 5000) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout);
const fetchPromise = fetch(url, { signal: controller.signal });
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error('Request timed out')), timeout);
});
return Promise.race([fetchPromise, timeoutPromise])
.finally(() => clearTimeout(timeoutId));
}
// 使用
fetchWithTimeout('https://api.example.com/data')
.then(data => console.log('Success:', data))
.catch(err => console.error('Failed:', err.message)); // 可能是网络错误,也可能是超时
注意陷阱:失败也会“胜出”
如果数组中某个 Promise 立即 reject(比如写错了 URL),race 会马上失败,即使其他 Promise 其实很快就能成功:
-
Promise.race([Promise.reject('oops'), Promise.resolve('ok')])→ 立即 rejected,不会等到 'ok' - 若只想取第一个成功的,需配合
catch把失败转为延迟 resolve,或改用Promise.any()(ES2021+,只关心首个 fulfilled)
和 Promise.any() 的区别
如果你只想要第一个 成功 的结果,不管其他是否失败,优先考虑 Promise.any():
-
Promise.race([p1, p2]):第一个 settled(成功/失败)就结束 -
Promise.any([p1, p2]):第一个 fulfilled 就结束;全失败才 rejected(返回AggregateError)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











