我有一个关于下面代码片段中操作顺序的问题,
const EventEmitter = require("events").EventEmitter;
const messenger = new EventEmitter();
process.nextTick(() => {
console.log("Next Tick");
});
messenger.on("message", (msg) => {
console.log("Message: ", msg);
});
messenger.emit("message", "Hello");
console.log("The end!");
我期望事件处理程序代码在所有同步代码都已经执行之后执行,理想情况下在process.nextTick()
之后执行,因为它是之前“注册”的。我的期望是:
The end!
Next Tick
Message: Hello
然而,输出
Message: Hello
The end!
Next Tick
有人能帮我一下吗?
2条答案
按热度按时间5gfr0r5j1#
事件本身不是异步的。如果你以同步的方式发出和处理它们,它们可以是同步的。
从Node.js文档:
“
EventEmitter
按注册的顺序同步调用所有侦听器。这确保了事件的正确顺序,并有助于避免争用条件和逻辑错误。在适当的情况下,侦听器函数可以使用setImmediate()
或process.nextTick()
方法切换到异步操作模式”。(See https://nodejs.org/api/events.html#asynchronous-vs-synchronous)
plupiseo2#
EventEmitter就像一个“函数调用助手”。
基本上意味着“请调用所有与事件'something'相关联的处理函数”。发射器 * 立即 *,同步地,并且不以涉及事件循环的方式,将一个接一个地进行那些函数调用。
因此,发射器模式看起来像是异步的,但实际上不是。
(not完全正确,但有点)。