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
相关产品推荐
相关产品推荐

