任務佇列和事件迴圈
阿新 • • 發佈:2021-07-21
轉載https://www.cnblogs.com/itgezhu/p/13259966.html
執行棧執行完同步任務,會向任務佇列獲取已處理完的非同步任務,非同步任務包括巨集任務(常見setTimeout)和微任務(常見promise),微任務在每一個巨集任務處理完時執行。(把全域性看成一個巨集任務,可理解為微任務先於巨集任務,如下例子)
console.log('1'); setTimeout(function() { console.log('2'); Promise.resolve().then(function() { console.log('3'); }) new Promise(function(resolve) { console.log('4'); resolve(); }).then(function() { console.log('5') }) }) Promise.resolve().then(function() { console.log('6'); }) new Promise(function(resolve) { console.log('7'); resolve(); }).then(function() { console.log('8') }) setTimeout(function() { console.log('9'); Promise.resolve().then(function() { console.log('10'); }) new Promise(function(resolve) { console.log('11'); resolve(); }).then(function() { console.log('12') }) })
答案:1、7、6、8、2、4、3、5、9、11、10、12
例子中,打印出1
後,new promise
會直接執行 7 ,而then
會進入任務佇列的微任務裡,此時 7
和6
同屬一個巨集任務裡的微任務,6
位置靠前,故先執行,,巨集任務(定時器)會在全域性的微任務結束後才執行,且巨集任務包含的微任務緊隨其後,故列印2 4 3 5
,之後的9 11 10 12
屬於後一個巨集任務,故最後輸出