You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise.race()中未胜出Promise的执行状态及可终止性确认

关于Promise.race中“输掉竞赛”的Promise状态问题

好问题!咱们把这个问题拆解清楚:

核心结论先给你:你的判断完全正确

Promise.race() 只会返回第一个**完成状态变更(resolve或reject)**的Promise的结果,但列表中其他未胜出的Promise并不会被终止——它们会继续在后台执行,直到自己完成状态变更(resolve/reject),这完全符合Promise的设计规范,因为目前确实没有原生方式可以“终止”一个已经处于pending状态的Promise。

为什么会这样?

Promise的设计原则之一是一旦创建就无法被取消:当你创建一个Promise并传入执行器函数后,这个函数里的逻辑就已经开始执行了,没有任何原生API可以中途打断它。Promise.race() 只是“监听”所有传入的Promise,谁先settle(完成状态变更)就把谁的结果返回,但它没有能力去干预其他Promise的执行流程。

用Node.js代码验证一下

你可以在Node环境里跑这段代码,直观看到效果:

// 一个2秒后完成的Promise
const slowTask = new Promise((resolve) => {
  setTimeout(() => {
    console.log('⚠️ 慢任务执行完毕');
    resolve('slow result');
  }, 2000);
});

// 一个1秒后完成的Promise
const fastTask = new Promise((resolve) => {
  setTimeout(() => {
    console.log('🏆 快任务执行完毕');
    resolve('fast result');
  }, 1000);
});

// 启动竞赛
Promise.race([fastTask, slowTask]).then(winner => {
  console.log('竞赛胜出结果:', winner);
});

运行后你会看到:

  1. 1秒后打印 🏆 快任务执行完毕 和 竞赛胜出结果: fast result
  2. 再过1秒,依然会打印 ⚠️ 慢任务执行完毕

这就明确证明了:输掉竞赛的slowTask并没有被终止,它还是完成了自己的执行逻辑。

注意事项

如果这些“输掉”的Promise包含副作用(比如发起网络请求、写入文件、修改数据库),这些操作依然会执行完成,不会被中断。所以在使用Promise.race()时,要考虑到这一点——比如如果用它来实现请求超时,超时后原来的请求还是会发送到服务器,服务器也会处理,只是客户端不再等待结果而已。

内容的提问来源于stack exchange,提问作者chetzacoalt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:12:39