我试图了解JavaScript中的事件循环。浏览了Mozilla Developer Network关于事件循环的链接。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
提到
队列
JavaScript运行时包含一个消息队列,它是一个列表 要处理的消息。每个消息都与一个函数相关联。 当堆栈为空时,将从队列中取出一条消息 处理。处理包括调用相关函数 (从而创建初始堆栈帧)。消息处理 当堆栈再次变空时结束。
在这种情况下,消息队列是什么意思?它是指我们在浏览器中执行的每次点击或kb事件吗?每个事件都是一条消息并添加到队列中?
请澄清。
答案 0 :(得分:2)
每个Javascript实例都有一个事件队列(或消息队列)。 node.js实例有一个,浏览器每个窗口有一个(可能还有扩展等,但你明白了)。需要注意的关键是它们是独立的。虽然每次点击,键盘事件等都会发布到浏览器的javascript队列,但它不会对您的节点实例的队列产生任何影响(除非您在浏览器中编写了将这些事件代理回节点的事件处理程序,但这有点奇怪)。希望这有助于澄清。如果我误解了你的问题,请告诉我。
您可能会发现我通过Bing搜索找到的“可视化javascript事件循环”这一链接有助于广泛了解事件队列和事件循环概念,特别是如果您检查一些其他建议的读数,各种评论提供:{{ 3}}
答案 1 :(得分:2)
术语"消息队列"几乎意味着它听起来像。它是要处理的消息的队列(读取:要执行的事件回调),一次一个并按顺序。
这个"消息队列"是不是 ECMAScript的一部分,但是用于描述在单线程执行模型中处理异步事件的行为 - 每个浏览器事件(点击次数,定时器,AJAX,等)被添加到队列中并以相同的方式处理。同样,node.js使用事件进行异步I / O操作。
"消息队列"每当没有针对给定的全局上下文(即窗口或进程)执行JavaScript时,处理为空(通过"事件循环")。这就是为什么阻止JavaScript是错误的 - 它会阻止队列被处理(这会阻止执行事件回调),直到阻塞代码停止执行。
event queue / event loop in node.js与浏览器的工作方式相同,只是使用不同的事件。这就是node.js如何在不暴露多个线程和相关复杂性的情况下支持并发的方式。
代码将消息添加到此消息队列中的最常见方法之一"与setTimeout
一致 - 当超时到期时,回调被添加到队列。假设有一点白痴(因为当事件实际发生时仅将回调添加到队列),请考虑
setTimeout(f, 0)
setTimeout(g, 0)
将"排队"序列f, g
中的回调,而
setTimeout(f, 20) // MUST exceed time to g event firing
setTimeout(g, 0)
将"排队"回调序列g, f
。可以依赖这些序列保证,因为(setTimeout保证并且)按顺序处理添加到队列的消息/事件。
由于上面的代码正在运行(例如正在执行JavaScript),因此还保证在给定的JavaScript停止执行和&#34之前,不会调用f
和g
回调。 ;消息队列"可以处理。但是,没有一般保证(在任何一种情况下)f
和g
之间不会处理其他事件/回调。