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

嵌套Promise执行顺序疑问:为何输出与预期不符?

嵌套Promise执行顺序疑问解答

问题代码

new Promise((resolve) => {
    new Promise((res) => {
        console.log("c");
        resolve(3);
        res(2);
    }).then((response) => console.log(response))
}).then((res) => console.log(res));

实际运行输出

c
2
3

用户预期输出

c
3
2

用户困惑:认为外层Promise会先被resolve,对应的then回调应该先执行,所以预期输出顺序为c→3→2,但实际顺序不符,需要解释执行逻辑。


执行顺序解析

  • 首先执行所有同步代码:

    1. 进入外层Promise的执行器函数,立刻创建内层Promise并执行其执行器:
      • 同步打印c,这是第一个输出;
      • 调用外层Promise的resolve(3):将外层Promise标记为已兑现状态,其then回调被加入微任务队列等待执行;
      • 调用内层Promise的res(2):将内层Promise标记为已兑现状态,其then回调同样被加入微任务队列——由于内层Promise的then是先绑定的,所以它的回调在微任务队列中排在外层回调的前面。
  • 同步代码执行完毕后,JS引擎开始按顺序处理微任务队列:

    1. 先执行队列中靠前的内层Promisethen回调,打印2;
    2. 再执行外层Promise的then回调,打印3。

核心要点:

  • Promise的执行器函数是同步执行的,resolve/res只是改变Promise状态,不会立刻触发then回调;
  • then回调会被放入微任务队列,队列遵循先进先出原则,先绑定的回调先执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:44:52