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

Promise执行顺序疑问:resolve嵌套Promise为何晚于3输出?

Promise嵌套resolve的执行顺序解析

要理解为什么7会在3之后打印,核心在于用Promise对象resolve另一个Promise时,会触发额外的微任务调度,具体拆解如下:

关键规范点

根据Promise A+规范,当调用resolve(x)时:

  • 如果x是普通值,当前Promise会立即进入resolved状态,其then回调直接加入微任务队列。
  • 如果x是Promise对象(或thenable对象),当前Promise会"接管"x的状态:即使x已经是resolved状态,当前Promise的状态变更和then回调的调度也需要额外经过一次微任务周期,而非同步完成。

代码执行流程

我们一步步走你的代码逻辑:

  1. 同步代码阶段

    • 第一个Promise执行器调用res(1),状态变为resolved(值1),它的第一个then回调(打印1)被加入微任务队列。
    • 第二个Promise执行器调用resolve(内层Promise),内层Promise立即调用resolve(7),状态变为resolved(值7)。此时外层Promise不会直接进入resolved状态,而是会生成一个专门处理嵌套Promise的微任务,等待后续调度。
  2. 第一轮微任务

    • 执行第一个Promise的第一个then回调:打印1,返回普通值2。第一个Promise的第二个then回调(打印2)被加入下一轮微任务队列。
  3. 第二轮微任务

    • 执行第一个Promise的第二个then回调:打印2,返回普通值3。第一个Promise的第三个then回调(打印3)被加入下一轮微任务队列。
  4. 第三轮微任务

    • 执行第一个Promise的第三个then回调:打印3,返回普通值4。第一个Promise的第四个then回调(打印4)被加入微任务队列。
    • 同时,处理嵌套Promise的微任务执行:外层Promise的状态变为resolved(值7),它的then回调(打印7)被加入当前微任务队列的末尾。
  5. 第四轮微任务

    • 先执行打印7的回调,再执行打印4的回调。

最终输出顺序就是:1 → 2 → 3 → 7 → 4,这就解释了为什么7会在3之后打印。

内容的提问来源于stack exchange,提问作者Ricky W. Chew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:59:57