首先看下列代碼的執行結果promise
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 |
✅ | ✅ |
回到題裏面bash
一、第一行是同步任務,優先級最高,因此第一次輸出1
二、後面有nextTick,是微任務,有promise是微任務,setTimeout是宏任務,因此setTimeouut裏的代碼最後執行
三、那就先依次執行微任務nextTick打印了2
四、接着執行另外一個微任務promise,打印了5,6
五、接着執行宏任務setTimeout,打印3
六、setTimeout裏面有一個微任務,而後執行它,打印4複製代碼
// 因此結果就是
1
2
5
6
3
4
複製代碼