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

Promise微任务队列执行顺序疑问:p2为何先于p1执行?

为什么Promise微任务队列的执行顺序和预期不符?

你这里的问题核心是混淆了Promise变量的定义顺序和then回调的入队顺序——微任务队列确实是严格的FIFO(先进先出),但你代码里的回调入队顺序和你想的刚好相反。

咱们一步步拆解代码的执行流程:

  • 首先创建promise1和promise2,两者都是立即决议的Promise实例
  • 接下来先执行promise2.then(p2):此时把回调p2加入微任务队列,队列内容是 [p2]
  • 然后才执行promise1.then(p1):把回调p1加入微任务队列,队列内容变成 [p2, p1]
  • 同步代码执行console.log('end test'),输出该内容
  • 当调用栈清空后,开始按FIFO顺序处理微任务队列:先取出队首的p2执行,输出in promise2.then(),再取出p1执行,输出in promise1.then()

你之前误以为promise1先定义,它的回调就会先入队,但实际上微任务的入队时机是看你调用then方法的顺序,不是Promise变量的创建顺序。如果把两个then的调用顺序调换:

const promise1 = Promise.resolve();
const promise2 = Promise.resolve();

promise1.then(function p1() {
  console.log('in promise1.then()')
})
promise2.then(function p2() {
  console.log('in promise2.then()')
})
console.log('end test')

运行结果就会符合你最初的预期:

end test
in promise1.then()
in promise2.then()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:48:16