天天看點

Promise的宏任務與微任務

先看例子:

new Promise(function(resolve, reject) {
    console.log(1);
    setTimeout(function() {
        console.log("First");
        resolve();
    }, 1000);
    console.log(2);

}
).then(function() {
    console.log(3);

    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log("Second");
            resolve();
        }, 4000);
    }
    );
}).then(function() {
    console.log(4);

    setTimeout(function() {
        console.log("Third");
    }, 3000);
    console.log(5);

});
console.log(0)
// 1
// 2
// 0
// undifined
// First
// 3
// Second
// 4
// 5
// Third      
  • macro-task(宏任務):包括整體代碼script,setTimeout,setInterval
  • micro-task(微任務):Promise,process.nextTic

執行機制1:

JS的執行機制是:

首先,判斷JS是同步還是異步,同步進入主線程,異步進入Event table

其次,異步任務在Event table中注冊函數,當滿足特定的條件,被推入Event queue

最後,同步任務進入主線程後一直執行,直到主線程空閑後,才會去Event queue中檢視是否有可執行的異步任務,如果有就推入主線程中執行。

循環以上三步執行,這就是Event loop。      

執行機制2:

執行一個宏任務,過程中如果遇到微任務,就将其放到微任務的【事件隊列】裡

目前宏任務執行完成後,會檢視微任務的【事件隊列】,并将裡面全部的微任務依次執行完      

這樣就不難分析出上面例子的代碼執行順序。

點選檢視原文