macrotask在一些文章中也被直接稱為task。
一個宿主環境只有一個事件迴圈,但可以有多個任務佇列。巨集任務佇列(macro task)與微任務佇列(micro task)就是其中之二。
每次事件迴圈的時候,微任務優先順序高於巨集任務。
巨集任務:script(全域性任務), setTimeout, setInterval, setImmediate, postMessage, MessageChannel, I/O, UI rendering.
微任務:process.nextTick, Promise, Object.observer, MutationObserver.
微任務總 process.nextTick > promise.then
巨集任務中,通常 setTimeout > setImmediate
setImmediate(): 是被設計用來一旦當前階段的任務執行完後執行。
setTimeout(): 是讓程式碼延遲執行。
如果沒有在一個I/O週期執行,那麼其執行順序是不確定的。
如果在一個I/O週期執行,setImmediate總是優先於setTimeout執行。
更多請檢視Jake Archibald關於macroTask和microTask的說明
https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/