【问题标题】:Is there a difference between event loop and task queue in browsers?浏览器中的事件循环和任务队列有区别吗?
【发布时间】:2013-02-26 16:09:01
【问题描述】:
【问题讨论】:
标签:
javascript
dom-events
setinterval
event-loop
task-queue
【解决方案1】:
堆:存储所有变量、对象、函数和分配给所有这些内存
Event Queue:他是包含列表函数的人TOBE EXCECUTED By Stack。
Stack:他是Event queue
持有
EXECUTES FUNCTIONS的主要人物
事件循环:
他是与Event Queue和Stack联系的人(经理)。
他所做的是 .Ifff stack 是 empty 并且 Event Queue 包含 要执行的函数。然后将第一个函数从事件队列推送到堆栈
视觉示例 1:latentflip
【解决方案2】:
这是一个实现细节——规范说一个事件循环可以使用多个任务队列来存储事件。大概对队列的大小没有实际限制。
例如,鼠标/键盘事件可以进入一个特殊的 INPUT 任务队列,该队列具有比其他任务更高的优先级,也许是为了让 UI 响应更快。
alert 会中断事件的处理,因为它是同步操作。大概任何适用的事件都会在此期间排队。
【解决方案3】:
我认为您只是在setInterval() 中看到了一种保护机制。如果setInterval() 无法跟上所需的间隔率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远累积,这不好,因为它会使某个地方的队列饱和。
从我在排队行为中看到的所有内容来看,时间间隔和事件都在同一个队列中,并按照它们应该发生的顺序进行处理。不同的是,如果队列中已经有一个setInterval()回调还没有被处理,它不会再把另一个放在队列中(从而跳过它)。
Mousemove 事件也经过特殊处理,因此您也不能用它们填满队列。
【解决方案4】:
您发布的问题确实很受欢迎,但您无法说清楚。
首先 js 本质上是同步的。浏览器有助于使其有点异步。
js 的调用栈是同步工作的,但是每当遇到异步代码(setTimeout(),HTTP 请求)时,它就会被发送到浏览器的 web api。
处理它的地方,例如等待请求的响应或等待超时完成。 (async 这段代码暂时从调用栈中移除,调用栈移到下一个任务上)
web api 收到响应或超时 fn 结束后,然后将其发送到任务队列,该队列将所有异步代码排队
这是事件循环真正发挥作用的地方。它首先检查调用堆栈是否为空,如果是,则将任务队列的第一个元素压入堆栈。
因此,当您发出警报时,它阻塞了调用堆栈,因此无法将 setInterval 推入调用堆栈