NodeJS 为什么事件处理程序代码在同步代码运行之前执行?

zzwlnbp8  于 2023-03-29  发布在  Node.js
关注(0)|答案(2)|浏览(154)

我有一个关于下面代码片段中操作顺序的问题,

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

有人能帮我一下吗?

5gfr0r5j

5gfr0r5j1#

事件本身不是异步的。如果你以同步的方式发出和处理它们,它们可以是同步的。
从Node.js文档:
EventEmitter按注册的顺序同步调用所有侦听器。这确保了事件的正确顺序,并有助于避免争用条件和逻辑错误。在适当的情况下,侦听器函数可以使用setImmediate()process.nextTick()方法切换到异步操作模式”。
(See https://nodejs.org/api/events.html#asynchronous-vs-synchronous)

plupiseo

plupiseo2#

EventEmitter就像一个“函数调用助手”。

emitter.emit("something", "hi there");

基本上意味着“请调用所有与事件'something'相关联的处理函数”。发射器 * 立即 *,同步地,并且不以涉及事件循环的方式,将一个接一个地进行那些函数调用。
因此,发射器模式看起来像是异步的,但实际上不是。

array.forEach(fn => fn());

(not完全正确,但有点)。

相关问题