gpt4 book ai didi

javascript - 此链接中的 "message queue"是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:24 27 4
gpt4 key购买 nike

我试图理解什么是 JavaScript 中的事件循环。发现了 Mozilla 开发者网络关于事件循环的链接。

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

里面提到了

Queue

A JavaScript runtime contains a message queue, which is a list ofmessages to be processed. To each message is associated a function.When the stack is empty, a message is taken out of the queue andprocessed. The processing consists of calling the associated function(and thus creating an initial stack frame). The message processingends when the stack becomes empty again.

在此上下文中消息队列是什么意思?它是指我们在浏览器中执行的每次点击或键盘事件吗?每个事件都是一条消息并添加到队列中?

请澄清。

最佳答案

术语“消息队列”的含义与听起来差不多。它是一个要处理的队列(读取:要执行的事件回调),一次一个并按顺序处理。

这个“消息队列”不是 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 while

的顺序对回调进行“排队”
setTimeout(f, 20) // MUST exceed time to g event firing
setTimeout(g, 0)

会将回调序列“排队”g, f。这些顺序保证是可以依赖的,因为(由于 setTimeout 保证)添加到队列中的消息/事件是按顺序处理的。

由于上面的代码正在运行(例如正在执行 JavaScript),因此还可以保证在给定的 JavaScript 停止执行并且可以处理“消息队列”之前,fg 回调都不会被调用。但是,不能普遍保证(在任何一种情况下)fg 之间不会处理额外的事件/回调。

关于javascript - 此链接中的 "message queue"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com