请分析以下代码的输出结果
const p1 = new Promise((resolve) => {
console.log('p1 constructor')
resolve(1)
})
const p2 = new Promise((resolve) => {
console.log('p2 constructor')
setTimeout(() => resolve(2), 0)
})
console.log('start')
p1.then(v => console.log('p1 then:', v))
p2.then(v => console.log('p2 then:', v))
queueMicrotask(() => console.log('microtask'))
console.log('end')输出结果
p1 constructor
p2 constructor
start
end
p1 then: 1
microtask
p2 then: 2分析
同步阶段:
new Promise的 executor 同步执行 →p1 constructorp2的 executor 同步执行 →p2 constructor,setTimeout放入宏任务队列startp1.then回调放入微任务队列(p1 已 resolve)p2.then回调暂不放入队列(p2 还在 pending)queueMicrotask放入微任务队列end
微任务阶段:
8. p1 then: 1 — 先注册的先执行
9. microtask
宏任务阶段:
10. setTimeout 回调执行,p2 resolve
11. p2 resolve 触发 p2.then → 放入微任务队列
12. 本轮宏任务结束后执行微任务 → p2 then: 2
关键点
new Promise的 executor 是同步执行的then回调只有当 Promise 状态变为 fulfilled/rejected 后才会进入微任务队列queueMicrotask显式添加微任务