js中的宏任務和微任務

我們都知道,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

如何分析異步執行的順序:

首先我們分析有多少個宏任務;

在每個宏任務中,分析有多少個微任務;

根據調用次序,確定宏任務中的微任務執行次序;

根據宏任務的觸發規則和調用次序,

確定宏任務的執行次序;確定整個順序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章