我們都知道,javaScript 是單線程的;
瀏覽器 通過拿到 j s 代碼 傳遞給 js引擎 去執行, 引擎按順序執行,這也就是宿主任務,
宿主任務:通過瀏覽器 去傳遞給js引擎去執行的任務;
當然 js 也可以通過 api 比如:setTimeout
, setInterval 等 讓宿主在特定時機 傳遞給引擎執行
在es5之後 es6 引入了 Promise 可以執行異步代碼
這樣,不需要瀏覽器的安排,JavaScript 引擎本身也可以發起任務了。
我們把宿主發起的任務稱爲宏觀任務,把 JavaScript 引擎發起的任務稱爲微觀任務。
所以宏觀任務包括:setTimeout,setInterval 等
微觀任務:Promise.then(()=>{//微任務代碼段}) 中執行的代碼
微任務必須在宏任務之前執行。因爲 在宏觀任務中 JavaScript 可能產生 Promise 這樣的異步代碼
JavaScript 必須保證這些異步代碼必須在一個宏觀任務中完成,因此,每個宏觀任務中又包含了一個微觀任務隊列:
看下面一個例子:
var r = new Promise(function(resolve, reject){
console.log("a");
resolve()
});
setTimeout(()=>console.log("d"), 0)
r.then(() => console.log("c"));
console.log("b")
打印結果爲: a b c d
如何分析異步執行的順序:
首先我們分析有多少個宏任務;
在每個宏任務中,分析有多少個微任務;
根據調用次序,確定宏任務中的微任務執行次序;
根據宏任務的觸發規則和調用次序,
確定宏任務的執行次序;確定整個順序。