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

为什么以下Promise链式调用在Chrome中的输出顺序为0 1 2 3 4 5 6?

问题原因分析

你出现预期和实际输出不一致的核心原因是V8引擎对Promise解析流程的迭代优化,和不同阶段的规范实现逻辑有关:

你最初的判断逻辑

你预期输出0 1 2 3 5 6 4,是基于早期ECMAScript规范对Promise的实现规则:
当then回调返回一个已完成状态的原生Promise时,需要经过2次额外的微任务调度,才能把返回值传递给链式调用的下一个then。
对应你的代码逻辑:

  • 第一个Promise链打印0之后,返回Promise.resolve(4),需要等待2次微任务调度才能触发打印4的回调
  • 这期间第二个Promise链的1、2、3、5、6会依次进入微任务队列并执行,所以4会排在最后输出。

实际Chrome输出的原因

现在Chrome使用的V8引擎对then返回原生Promise的场景做了专门的优化,砍掉了不必要的微任务调度步骤,将原本需要的2次额外调度大幅压缩,打印4的回调会提前进入微任务队列,最终输出为0 1 2 3 4 5 6。

测试代码

Promise.resolve()
  .then(() => {
    console.log(0)
    return Promise.resolve(4)
  })
  .then((res) => {
    console.log(res)
  })

Promise.resolve()
  .then(() => {
    console.log(1)
  })
  .then(() => {
    console.log(2)
  })
  .then(() => {
    console.log(3)
  })
  .then(() => {
    console.log(5)
  })
  .then(() => {
    console.log(6)
  })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:54:00