1. 程式人生 > 其它 >任務佇列和事件迴圈

任務佇列和事件迴圈

轉載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會進入任務佇列的微任務裡,此時 76 同屬一個巨集任務裡的微任務,6位置靠前,故先執行,,巨集任務(定時器)會在全域性的微任務結束後才執行,且巨集任務包含的微任務緊隨其後,故列印2 4 3 5,之後的9 11 10 12屬於後一個巨集任務,故最後輸出