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

为何setTimeout回调在Promise.race中执行顺序不符合预期?

关于Promise.race执行结果不符合预期的原因分析

先看这段代码:

Promise.race([
    new Promise(_ => setTimeout(() => _("first one"), 999.1)),
    new Promise(_ => setTimeout(() => _("second one"), 999)),
]).then(console.log)

按照Promise.race的定义,它应该返回最先resolve的Promise的值,理论上延迟999ms的第二个Promise会先触发,预期输出second one,但实际输出却是first one,原因主要有两点:

  • 定时器的最小精度限制:JavaScript运行时(浏览器或Node.js)的setTimeout并不支持精确到毫秒小数位的延迟。这类定时器存在一个最小精度阈值(通常在4ms左右,不同环境略有差异),当两个延迟时间的差值远小于这个阈值时,运行时无法精准区分它们的先后触发顺序。
  • 定时器队列的调度顺序:代码中第一个Promise先被创建,对应的setTimeout会先被推入定时器任务队列。当两个定时器的延迟时间无法被精度区分时,队列中先进入的任务会优先被执行,导致第一个Promise先resolve,Promise.race自然会返回它的值。

你的理解误区在于过度信任setTimeout的时间精度——它并不是一个高精度定时器,无法保证小于最小精度阈值的时间差能被正确识别。Promise.race的逻辑本身没有问题,问题出在底层定时器的实现限制上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:20:55