【问题标题】:Is there a difference between event loop and task queue in browsers?浏览器中的事件循环和任务队列有区别吗?
【发布时间】:2013-02-26 16:09:01
【问题描述】:

我对这个问题的答案中的一些术语有点困惑:What is the event precedence in JavaScript?

事件循环和任务队列之间有区别吗?这些队列可以有多大?

因为当我用setInterval() 设置了一个间隔并用alert() 中断它时,间隔会在警报出现的时间被丢弃。

【问题讨论】:

  • 这是事件循环,不是事件队列:)

标签: javascript dom-events setinterval event-loop task-queue


【解决方案1】:

:存储所有变量、对象、函数和分配给所有这些内存

Event Queue:他是包含列表函数的人TOBE EXCECUTED By Stack

Stack:他是Event queue

持有EXECUTES FUNCTIONS的主要人物

事件循环

  1. 他是与Event QueueStack联系的人(经理)。

  2. 他所做的是 .Ifff stackempty 并且 Event Queue 包含 要执行的函数然后将第一个函数从事件队列推送到堆栈

视觉示例 1latentflip

【讨论】:

    【解决方案2】:

    这是一个实现细节——规范说一个事件循环可以使用多个任务队列来存储事件。大概对队列的大小没有实际限制。

    例如,鼠标/键盘事件可以进入一个特殊的 INPUT 任务队列,该队列具有比其他任务更高的优先级,也许是为了让 UI 响应更快。

    alert 会中断事件的处理,因为它是同步操作。大概任何适用的事件都会在此期间排队。

    【讨论】:

    【解决方案3】:

    我认为您只是在setInterval() 中看到了一种保护机制。如果setInterval() 无法跟上所需的间隔率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远累积,这不好,因为它会使某个地方的队列饱和。

    从我在排队行为中看到的所有内容来看,时间间隔和事件都在同一个队列中,并按照它们应该发生的顺序进行处理。不同的是,如果队列中已经有一个setInterval()回调还没有被处理,它不会再把另一个放在队列中(从而跳过它)。

    Mousemove 事件也经过特殊处理,因此您也不能用它们填满队列。

    【讨论】:

      【解决方案4】:

      您发布的问题确实很受欢迎,但您无法说清楚。

      首先 js 本质上是同步的。浏览器有助于使其有点异步。

      js 的调用栈是同步工作的,但是每当遇到异步代码(setTimeout(),HTTP 请求)时,它就会被发送到浏览器的 web api。

      处理它的地方,例如等待请求的响应或等待超时完成。 (async 这段代码暂时从调用栈中移除,调用栈移到下一个任务上)

      web api 收到响应或超时 fn 结束后,然后将其发送到任务队列,该队列将所有异步代码排队

      这是事件循环真正发挥作用的地方。它首先检查调用堆栈是否为空,如果是,则将任务队列的第一个元素压入堆栈。

      因此,当您发出警报时,它阻塞了调用堆栈,因此无法将 setInterval 推入调用堆栈

      【讨论】:

        猜你喜欢
        • 2019-07-25
        • 2017-04-14
        • 2021-04-03
        • 2014-11-12
        • 2014-05-07
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多