前言
我們知道 js 是單線程執行的,那么異步的代碼 js 是怎么處理的呢?例如下面的代碼是如何進行輸出的:
console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.now());}).then(function() { console.log(4);});console.log(5);setTimeout(function() { new Promise(function(resolve) { console.log(6); resolve(Date.now()); }).then(function() { console.log(7); });}, 0);在不運行的情況可以先猜測下最終的輸出,然后展開我們要說的內容。
1. 宏任務與微任務
依據我們多年編寫 ajax 的經驗:js 應該是按照語句先后順序執行,在出現異步時,則發起異步請求后,接著往下執行,待異步結果返回后再接著執行。但他內部是怎樣管理這些執行任務的呢?
在 js 中,任務分為宏任務(macrotask)和微任務(microtask),這兩個任務分別維護一個隊列,均采用先進先出的策略進行執行!同步執行的任務都在宏任務上執行。
宏任務主要有:script(整體代碼)、setTimeout、setInterval、I/O、UI 交互事件、postMessage、MessageChannel、setImmediate(Node.js 環境)。
微任務主要有:Promise.then、 MutationObserver、 process.nextTick(Node.js 環境)。
具體的操作步驟如下:
這 4 步構成了一個事件的循環檢測機制,即我們所稱的eventloop。
回到我們上面說的代碼:
console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.now());}).then(function() { console.log(4);});console.log(5);setTimeout(function() { new Promise(function(resolve) { console.log(6); resolve(Date.now()); }).then(function() { console.log(7); });}, 0);執行步驟如下:
新聞熱點
疑難解答
圖片精選