簡體   English   中英

宏任務隊列和微任務隊列優先級

[英]macrotask queue and microtask queue priority

macrotaskmicrotask macrotask隊列的這種描述有點混淆。

對於“事件循環”的每個循環,從宏任務隊列中完成一個宏任務。 宏任務完成后,事件循環訪問微任務隊列。 整個微任務隊列在繼續之前完成。

 setTimeout(function() { console.log('macrotask'); }, 0); Promise.resolve().then(function() { console.log('microtask 1'); }).then(function() { console.log('microtask 2'); });

這段代碼不應該先輸出'macrotask'嗎? 因為 setTimeout 是在循環進入微任務隊列之前完成的宏任務隊列的一部分?

在執行任何 JS 文件時,JS 引擎將內容包裝在一個函數中,並將該函數與啟動或啟動事件相關聯。 JS 引擎發出開始事件,這些事件被添加到任務隊列中(作為一個宏任務)。

初始化時,JS 引擎首先拉出宏任務隊列中的第一個任務並執行回調處理程序。 這樣,我們的代碼就運行起來了。

所以我們看到運行的腳本是第一個排隊的macrotask 所以首先 JSEngine 將腳本中的所有同步代碼作為macrotask事件循環隊列中。 然后它看到setTimeout這是另一個macrotask因此它被記錄在事件循環隊列中的一個單獨任務中。 然后它看到 Promise 是一個microtask ,並將其添加到微任務隊列中。

只要沒有其他 JavaScript 在執行中間和每個任務結束,微任務隊列就會在回調之后處理。

所以任務隊列的順序,在這種情況下,是Script=>Promise1=>Promise2=>setTimeout

由於腳本中沒有同步代碼,因此腳本的執行不會打印任何內容。 然后引擎執行微任務隊列(promise-1,promise-2),最后是setTimeout宏任務。

在此處輸入圖片說明

注意:- 這是默認行為,在不同的瀏覽器中可能會有所不同。

您的代碼正在運行的macrotask實際上是一個macrotask

完成后(這意味着評估並運行代碼)事件循環將執行隊列中的微任務。 這是第一個承諾,但是這個承諾為微任務q增加了另一個承諾,並且執行了第二個承諾。

在微任務q被清除之后,挑選另一個宏任務,並最終執行timeout

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM