引用自:https://zh.javascript.info/event-loop
總結(jié)
更詳細(xì)的事件循環(huán)算法(盡管與 規(guī)范 相比仍然是簡(jiǎn)化過(guò)的):
- 從 宏任務(wù) 隊(duì)列(例如 “script”)中出隊(duì)(dequeue)并執(zhí)行最早的任務(wù)。
- 執(zhí)行所有 微任務(wù):
- 當(dāng)微任務(wù)隊(duì)列非空時(shí):
- 出隊(duì)(dequeue)并執(zhí)行最早的微任務(wù)珊擂。
- 當(dāng)微任務(wù)隊(duì)列非空時(shí):
- 執(zhí)行渲染拟淮,如果有继控。
- 如果宏任務(wù)隊(duì)列為空抵代,則休眠直到出現(xiàn)宏任務(wù)描沟。
- 轉(zhuǎn)到步驟 1预愤。
安排(schedule)一個(gè)新的 宏任務(wù):
- 使用零延遲的
setTimeout(f)
贯被。
它可被用于將繁重的計(jì)算任務(wù)拆分成多個(gè)部分眼五,以使瀏覽器能夠?qū)τ脩羰录鞒龇磻?yīng)妆艘,并在任務(wù)的各部分之間顯示任務(wù)進(jìn)度。
此外看幼,也被用于在事件處理程序中批旺,將一個(gè)行為(action)安排(schedule)在事件被完全處理(冒泡完成)后。
安排一個(gè)新的 微任務(wù):
- 使用
queueMicrotask(f)
诵姜。 - promise 處理程序也會(huì)通過(guò)微任務(wù)隊(duì)列朱沃。
在微任務(wù)之間沒(méi)有 UI 或網(wǎng)絡(luò)事件的處理:它們一個(gè)立即接一個(gè)地執(zhí)行
。
所以茅诱,我們可以使用 queueMicrotask
來(lái)在保持環(huán)境狀態(tài)一致的情況下逗物,異步地執(zhí)行一個(gè)函數(shù)。