const first = () => (new Promise((resolve, reject) => {
console.log(3);
let p = new Promise((resolve, reject) => {
console.log(7);
setTimeout(() => {
console.log(5);
resolve(6);
}, 0)
resolve(1);
});
resolve(2);
p.then((arg) => {
console.log(arg);
});
}));
first().then((arg) => {
console.log(arg);
});
console.log(4);
事件循环,先执行宏任务,主script,new Promise立即执行而后微任务,然后第二轮事件循坏直至结束。
Event Quene 执行顺序为宏任务(macrotask)==> 微任务(microtask)==> ...
第一步:执行first() 遇new Promise立即执行,promise为同步,其resolve reject 为异步 ,故log(3)入宏任务队列中;
第二步:遇new promise 立即执行,log(7)入宏任务队列;
第三步:遇setTimeout 入下一轮事件循坏;
第四步:遇resolve(1)入微任务队列;
第五步:遇resolve(2)入微任务队列;
第六步:log(4)入宏任务队列;
第七步:进行第二轮事件循坏,开始读取setTimeout,遇log(5)入第二轮宏任务队列;
第八步:遇resolve(6)入微任务队列,微任务是异步的,故微任务队列只有一轮,同时由于resolve(1)该promise已经fulfilled,状态不可更改,故resolve(6)无效为undefined;
第九步:按照队列的先进先出,Event Quene的执行顺序依次出列,3 4 7 1 2 undefined 5;
总结
哪些是宏任务/微任务?
宏任务 | 微任务 |
---|---|
setTimeout | process.nextTick |
setInterval | MutationObserver |
MessageChannel | Promise.then |
requestAnimationFrame |
参考此表格和以上分析,基本能确定输出顺序了
另外async awati执行顺序,参考
Jamki小烽烽
博客,总结的非常不错
(45条消息) 一道面试题:还在纠结async/ await、Promise的执行顺序?_m0_37922914的博客-CSDN博客