浏览器中的事件循环和任务队列之间有区别吗
Is there a difference between event loop and task queue in browsers?
我对这个问题的答案中的一些术语有点困惑:JavaScript中的事件优先级是什么?
事件循环和任务队列之间有区别吗?这些队列有多大?
因为当我用setInterval()
设置了一个间隔并用alert()
中断时,间隔会在警报显示的时间内被丢弃。
堆:存储所有变量、对象、函数和To所有这些内存都被分配
事件队列:他是包含列表函数的人被堆栈超过。
堆栈:他是事件队列持有的执行功能的主要人员
事件循环:
-
他是与事件队列和堆栈联系的人员(经理(。
-
他做的是Ifff堆栈为空且事件队列包含要执行的函数然后将事件队列中的第一个函数推送到堆栈
可视化示例1:latentflip
这是一个实现细节-规范说一个事件循环可以使用多个任务队列来存储事件。据推测,队列的大小没有实际限制。
例如,鼠标/键盘事件可以进入一个特殊的INPUT任务队列,该队列的优先级高于其他任务,这可能是为了使UI更具响应性。
alert
将中断事件的处理,因为它是一个同步操作。据推测,在此期间,任何适用的事件都将排队。
我认为您只是在setInterval()
中看到了一种保护机制。如果setInterval()
无法跟上所需的间隔速率,那么它将跳过间隔,因为如果没有,那么额外的间隔可能会永远累积起来,这是不好的,因为它会使某个地方的队列饱和。
从我在排队行为中看到的一切来看,间隔和事件都在同一个队列中,并按照它们应该发生的顺序进行处理。不同的是,如果队列中已经有一个尚未处理的setInterval()
回调,它不会在队列中放入另一个回调(从而跳过它(。
Mousemove事件也是经过特殊处理的,所以你也不能用它们来填满队列。
您发布的问题确实很受欢迎,但您无法清晰地回答。
首先,js本质上是同步的。浏览器有助于使它有点异步。
js的调用堆栈是同步工作的,但每当遇到异步代码(setTimeout((,HTTP请求(时,它都会被发送到浏览器的web api。
在哪里处理它,比如等待请求的响应或等待超时完成。(异步代码暂时从调用堆栈中删除,调用堆栈转移到下一个任务(
在web api接收到响应或超时fn结束后,它被发送到任务队列,该队列将所有异步代码排队
这是事件循环真正发挥作用的地方。它首先检查调用堆栈是否为空,如果为空,则将任务队列的第一个元素推送到堆栈上。
因此,在您发出警报的情况下,它阻止了调用堆栈,因此setInterval无法推送到调用堆栈
- 如何使用nodejs在firebase队列中推送具有SpecId的任务
- Ext JS Gannt 在任务之间添加链接
- 将值 fron conf.js 传递给咕噜咕噜的任务或在咕噜咕噜的任务之间传递
- 如果选择了下拉列表中的特定值,GAE 任务队列将不会继续
- 繁重的任务:删除 HTML 文件中标记之间的行
- Javascript事件循环任务队列溢出是否可能
- 分布式任务调度,作业队列
- “;调用堆栈”;以及“;任务队列”;
- 事件循环上下文中的微任务和宏任务之间的区别
- 使用通道API从任务队列中的任务接收消息
- 任务队列第5步失败:由于跨域策略限制,无法加载播放列表- Youtube
- RxJS 5任务队列,如果任务失败继续
- 有效地减少时间约束任务之间的等待时间
- 队列任务异常:TypeError: Cannot read property 'length'零
- Javascript'使用未声明函数作为对象的能力如何帮助在计算机之间划分任务?
- 在dev和prod之间切换任务
- 浏览器中的事件循环和任务队列之间有区别吗
- Gruntjs:我可以在不同的ftpush任务之间共享“身份验证”部分吗?
- XHR进度事件微任务队列
- 在项目之间重用Gulp任务