event loop 标准
2020-07-13 本文已影响0人
roger1253
原文: https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
只要事件循环存在,它就必须按以下步骤持续运行:
- 让
taskQueue
成为事件循环的任务队列之一,以定义实现的方式选择,并且所选任务队列必须至少包含一个具有该约束的可运行任务。如果没有这样的任务队列,就跳到下面的微任务步骤。
请记住,微任务队列不是任务队列,所以它在这一步中不会被选择。但是,一个与微任务源关联的任务队列,有可能在这一步被选择。在这种情况下,下一步中选择的任务最初是一个微任务,但它被改变位置成了旋转事件循环的一部分。
- 设置
oldestTask
为taskQueue
中第一个可运行的任务,并将其从taskQueue
中删除。 - 将事件循环的当前运行任务设置为
oldestTask
。 - 将
taskStartTime
设为当前高精度时间。 - 执行
oldestTask
的步骤。 - 将事件循环当前正在运行的任务设置回
null
。 - 微任务:执行微任务检查点。
- 设置
hasARenderingOpportunity
为false
。 - 设置
now
为当前的高精度时间。 - 通过执行以下步骤报告任务的持续时间:
- 设置
top-level browsing contexts
为一个空的set
- 对于每一个设置了
oldestTask
的脚本计算环境设置对象集的环境设置对象,将设置的顶级浏览器上下文附加到top-level browsing contexts
- 报告长任务,传入
taskStartTime
、now
(任务的结束时间)、top-level browsing contexts
和oldestTask
。
- 更新渲染:如果这是一个窗口事件循环,则:
- 设置
docs
为相关代理事件循环为此事件循环的全部文档对象,任意排序,但必须满足以下条件: - 任意的文档B,如果其浏览器上下文的容器文档是A,它必须在列表中被排列在A之后。