之前的话我自己也是在网上查了很多的资料,关于宏任务和微任务的执行时机,以下的是我自己做的关于宏任务和微任务的小总结。
首先看一下事件循环机制的基础模型
1. 由各种io操作 (setTimeout/ ajax) 生成的事件会被先放到任务队列中等待被执行
2. 任务队列有一个特点 谁先进入谁先执行
3. 任务队列中的代码 只有成功进入到主线程 才能被执行
哪些是宏任务,哪些是微任务呢?
宏任务:script整体代码,setTimeout,setInterval
微任务:promise.then ,process.nextTick。
宏任务和微任务之间有什么关系呢?
1. 任务队列中描述的只有宏任务
2.每一个宏任务都会绑定一个属于自己的微任务队列 当前宏任务中的同步代码执行完毕之后 会检查当前微任务队列中是否有微任务 如果有全部遍历执行 执行完毕所有的微任务之后 才会执行下一个宏任务
3. 当前宏任务中如果在执行的过程中又产生了新的宏任务 直接去任务队列中排队
4.当前的宏任务又产生了新的微任务 直接放到当前宏任务绑定的微任务队列中等待执行
5. 当前的微任务中又生成了新的微任务 同样会放到当前微任务所属宏任务中的微任务队里中去
下面看一道练习题
console.log(1)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(6)
}, 0)
}, 0)
Promise.resolve().then(() => {
console.log(3)
setTimeout(() => {
console.log(4)
}, 0)
})
console.log(5) // 1 5 3 2 4 6
最后的执行结果为 : 1 5 3 2 4 6
让我们再看一下这段代码,首先执行console.log(1),接着遇见了settimeout,这是第二个宏任务,所以直接去任务队列排队,promise.resolve().then属于微任务,所以等待整体script代码,这个第一个宏任务执行完毕,然后console.Log(5),script代码(第一个宏任务)执行完毕,然后插队执行promise.then 这个微任务,执行完后又是一个宏任务settimeout,这是第三个宏任务,遇见新的宏任务就直接去任务队列排队,接着执行第二个宏任务,也就是第一个settimeout,所以打印结果2,执行完后,又遇见了新的宏任务,直接去任务队列里排队,接着执行排在第二个宏任务后的宏任务,所以打印4,最后执行第四个宏任务,打印结果6,所以结果就是 1 5 3 2 4 6
以上是我自己的个人理解,如果有不对的地方,欢迎各位业界大佬指点