为什么以下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
相关产品推荐
相关产品推荐

