"消息队列"是什么意思?在这个链接?

时间:2014-04-03 03:29:56

标签: node.js javascript-events event-handling

我试图了解JavaScript中的事件循环。浏览了Mozilla Developer Network关于事件循环的链接。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop

提到

  

队列

     

JavaScript运行时包含一个消息队列,它是一个列表   要处理的消息。每个消息都与一个函数相关联。   当堆栈为空时,将从队列中取出一条消息   处理。处理包括调用相关函数   (从而创建初始堆栈帧)。消息处理   当堆栈再次变空时结束。

在这种情况下,消息队列是什么意思?它是指我们在浏览器中执行的每次点击或kb事件吗?每个事件都是一条消息并添加到队列中?

请澄清。

2 个答案:

答案 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之前,不会调用fg回调。 ;消息队列"可以处理。但是,没有一般保证(在任何一种情况下)fg之间不会处理其他事件/回调。