Promise.race用于获取最先完成的Promise结果,适用于超时控制、最快数据源响应、用户交互优先和检测服务可用性场景。

Promise.race 方法接收一个 Promise 数组,返回一个新的 Promise,这个新 Promise 会在其中任何一个 Promise 首先完成(无论是 resolve 还是 reject)时立即结束,并以那个最先完成的结果或错误作为结果。这种“竞速”机制在一些特定场景下非常实用。
这是 Promise.race 最常见的用途之一:为异步操作设置最大等待时间。如果目标操作在指定时间内未完成,则用超时逻辑替代。
例如,发起一个网络请求并限制其必须在 5 秒内返回:
const fetchWithTimeout = (url, timeout) => { 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]); }; // 使用 fetchWithTimeout('/api/data', 5000) .then(response => console.log('Success:', response)) .catch(err => console.error('Failed:', err.message));一旦超时 Promise 先 resolve 或 reject,整个请求就会中断,避免长时间挂起。
立即学习“Java免费学习笔记(深入)”;
当有多个相同数据来源的接口(如多个 CDN 或备份服务器),可以使用 race 来获取最快返回的结果,提升用户体验。
比如从两个镜像地址加载资源:
const fastestImageLoad = (urls) => { const promises = urls.map(url => { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve(url); img.onerror = () => reject(new Error(`Failed to load ${url}`)); img.src = url; }); }); return Promise.race(promises); }; fastestImageLoad(['/img/a.png', '/backup/img/a.png']) .then(src => console.log('Loaded from:', src)) .catch(err => console.error('All sources failed:', err));页面能更快展示内容,尤其在网络不稳定时优势明显。
在某些场景中,你可能启动一个自动操作(如自动跳转或默认选择),但希望用户操作能中断它。
例如,页面 3 秒后自动跳转,但如果用户提前点击按钮,则立即跳转:
const autoRedirect = new Promise(resolve => { setTimeout(() => resolve('auto'), 3000); }); const userClick = new Promise(resolve => { document.getElementById('skip-btn').addEventListener('click', () => { resolve('user'); }); }); Promise.race([autoRedirect, userClick]).then(action => { console.log(`${action === 'user' ? 'User clicked' : 'Auto redirect'}`); navigateToNextPage(); });这样既保证了自动化,又尊重了用户主动性。
在系统初始化时,可并发检测多个关键服务是否可达,只要有一个快速响应即可继续流程。
比如检查登录状态时尝试多个端点:
Promise.race([ fetch('/auth/check-v1').then(res => res.json()), fetch('/auth/check-v2').then(res => res.json()) ]) .then(status => { if (status.authenticated) proceed(); }) .catch(() => console.warn('All auth checks failed'));适用于高可用架构中“只要有可用节点就行”的场景。
基本上就这些。Promise.race 的核心价值在于“谁快听谁的”,适合用于超时控制、性能优化和用户行为响应等需要快速决策的场合。注意:一旦某个 Promise 完成,其余的并不会被取消,只是不再被关注,因此需注意资源清理问题。
以上就是JavaScript中的Promise.race方法有哪些实用的应用场景?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号