同步任務(巨集任務,微任務),非同步任務
首先看下列程式碼的執行結果
console.log(1)
process.nextTick(function(){
console.log(2)
})
setTimeout(function(){
console.log(3)
process.nextTick(function(){
console.log(4)
})
})
Promise.resolve().then(function() {
console.log(5);
}).then(function() {
console.log(6)
});複製程式碼
同步任務、微任務、巨集任務的執行優先順序如下:
同步任務 > 微任務 > 巨集任務複製程式碼
巨集任務包括
# | 瀏覽器 | Node |
---|---|---|
I/O | ✅ | ✅ |
setTimeout | ✅ | ✅ |
setInterval | ✅ | ✅ |
setImmediate | ❌ | ✅ |
requestAnimationFrame | ✅ | ❌ |
微任務包括
# | 瀏覽器 | Node |
---|---|---|
process.nextTick | ❌ | ✅ |
MutationObserver | ✅ | ❌ |
Promise.then catch finally | ✅ | ✅ |
回到題裡面
1、第一行是同步任務,優先順序最高,所以第一次輸出1
2、後面有nextTick,是微任務,有promise是微任務,setTimeout是巨集任務,所以setTimeouut裡的程式碼最後執行
3、那就先依次執行微任務nextTick列印了2
4、接著執行另一個微任務promise,列印了5,6
5、接著執行巨集任務setTimeout,列印3
6、setTimeout裡面有一個微任務,然後執行它,列印4複製程式碼
// 所以結果就是
1
2
5
6
3
4
複製程式碼