先看例子:
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:
執行一個宏任務,過程中如果遇到微任務,就将其放到微任務的【事件隊列】裡
目前宏任務執行完成後,會檢視微任務的【事件隊列】,并将裡面全部的微任務依次執行完
這樣就不難分析出上面例子的代碼執行順序。
點選檢視原文