看了很多对于微任务宏任务事件循环的讲解,有很多不同的地方,有人说代码块是宏任务,所以事件循环是宏->微的循环,还有人说先微后宏任务。
常见宏任务包括:
常见微任务包括
执行的过程大概是:
注意:promise中.then内才是异步微任务,new promise中前面部分是同步任务,setTimeout也只有里面回调才会进入异步队列。
1 setTimeout(() => { 2 console.log(1); 3 setTimeout(() => { 4 console.log(3) 5 }, 0) 6 new Promise(resolve => { 7 resolve() 8 console.log(‘promise‘) 9 }).then(() => { 10 console.log(‘then‘) 11 }) 12 }, 0) 13 14 setTimeout(() => { 15 console.log(2) 16 }, 0) 17 console.log(‘first‘)
以上代码的执行过程:同步代码console.log(first)进入主线程执行输出,将俩个宏任务回调依次进入宏任务队列取名macro1 macro2。随后发现微任务队列为空,则宏任务队列中macro1进入执行栈,执行同步代码console.log(1)、console.log(‘promise‘);发现并将宏任务macro3放入宏任务队列中,.then中内容为微任务micro1放入微任务队列中。此时一轮结束,宏任务队列中是 macro2、macro3,微任务队列中是micro1。接下来重新循环,执行微任务micro1,结束后执行macro2、macro3。最后结果显示 first、1、promise、then、2、3.
总结一下面试题看代码输出的套路:
https://juejin.cn/user/2999123452373735
原文:https://www.cnblogs.com/zxf906/p/15310578.html