原文: https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
只要事件循環(huán)存在夫偶,它就必須按以下步驟持續(xù)運(yùn)行:
- 讓
taskQueue
成為事件循環(huán)的任務(wù)隊(duì)列之一,以定義實(shí)現(xiàn)的方式選擇,并且所選任務(wù)隊(duì)列必須至少包含一個(gè)具有該約束的可運(yùn)行任務(wù)识藤。如果沒有這樣的任務(wù)隊(duì)列空闲,就跳到下面的微任務(wù)步驟。
請記住,微任務(wù)隊(duì)列不是任務(wù)隊(duì)列拦英,所以它在這一步中不會(huì)被選擇。但是院峡,一個(gè)與微任務(wù)源關(guān)聯(lián)的任務(wù)隊(duì)列兴使,有可能在這一步被選擇。在這種情況下照激,下一步中選擇的任務(wù)最初是一個(gè)微任務(wù)发魄,但它被改變位置成了旋轉(zhuǎn)事件循環(huán)的一部分。
- 設(shè)置
oldestTask
為taskQueue
中第一個(gè)可運(yùn)行的任務(wù)俩垃,并將其從taskQueue
中刪除励幼。 - 將事件循環(huán)的當(dāng)前運(yùn)行任務(wù)設(shè)置為
oldestTask
。 - 將
taskStartTime
設(shè)為當(dāng)前高精度時(shí)間口柳。 - 執(zhí)行
oldestTask
的步驟苹粟。 - 將事件循環(huán)當(dāng)前正在運(yùn)行的任務(wù)設(shè)置回
null
。 - 微任務(wù):執(zhí)行微任務(wù)檢查點(diǎn)跃闹。
- 設(shè)置
hasARenderingOpportunity
為false
嵌削。 - 設(shè)置
now
為當(dāng)前的高精度時(shí)間。 - 通過執(zhí)行以下步驟報(bào)告任務(wù)的持續(xù)時(shí)間:
- 設(shè)置
top-level browsing contexts
為一個(gè)空的set
- 對于每一個(gè)設(shè)置了
oldestTask
的腳本計(jì)算環(huán)境設(shè)置對象集的環(huán)境設(shè)置對象望艺,將設(shè)置的頂級瀏覽器上下文附加到top-level browsing contexts
- 報(bào)告長任務(wù)苛秕,傳入
taskStartTime
、now
(任務(wù)的結(jié)束時(shí)間)找默、top-level browsing contexts
和oldestTask
艇劫。
- 更新渲染:如果這是一個(gè)窗口事件循環(huán),則:
- 設(shè)置
docs
為相關(guān)代理事件循環(huán)為此事件循環(huán)的全部文檔對象惩激,任意排序店煞,但必須滿足以下條件: - 任意的文檔B,如果其瀏覽器上下文的容器文檔是A风钻,它必須在列表中被排列在A之后顷蟀。