Nodejs事件发射器程序中语句的执行顺序

Posted

技术标签:

【中文标题】Nodejs事件发射器程序中语句的执行顺序【英文标题】:Order of execution of statements in Nodejs event emitter program 【发布时间】:2022-01-21 14:17:56 【问题描述】:

我尝试了以下 NodeJs 示例:

const EventEmitter = require('events');
var eventEmitter = new EventEmitter();

var fun1 = (msg) => 
    console.log("Message from fun1: " + msg);
;
var fun2 = (msg) => 
    console.log("Message from fun2: " + msg);
;

eventEmitter.on('myEvent', fun1);
eventEmitter.on('myEvent', fun1);
eventEmitter.on('myEvent', fun2);

eventEmitter.removeListener('myEvent', fun1);
eventEmitter.emit('myEvent', "Event occurred");
console.log(eventEmitter.listenerCount('myEvent'));
eventEmitter.removeAllListeners('myEvent');
console.log(eventEmitter.listenerCount('myEvent'));

eventEmitter.emit('myEvent', "Event occurred");

输出是:

来自 fun1 的消息:事件发生

来自 fun2 的消息:事件发生

2

0

请帮助我理解输出,因为根据我的预期,不应该打印“来自 fun2 的消息:事件发生”行,因为我在它之前调用了 removeAllListeners。并且,事件发射器函数被同步调用。另外,如果事件发射器函数真的是以同步方式执行的,为什么所有控制台日志都在最后打印出来?

【问题讨论】:

【参考方案1】:

Nodejs 文档说

如果任何单个侦听器已多次添加到侦听器 指定 eventName 的数组,则 removeListener() 必须是 多次调用以删除每个实例。

这就是为什么它仍然打印计数为 2。因为对于事件“myevent”“fun1”和“fun2”仍有两个活动的侦听器。

您最后一个问题的答案是eventEmitter.emit 是阻塞(同步)代码。最后你会看到控制台的所有日志。

【讨论】:

感谢您的帮助,但是,您的回答不适用于这里,因为我第二次使用 removeAllListeners,而不是 removeListener。问题仍然存在......为什么“来自 fun2 的消息:事件发生”被打印出来,为什么所有控制台日志都在最后执行? 突出显示文本的最后一段回答了您的问题。查看更新的答案。

以上是关于Nodejs事件发射器程序中语句的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

带有条件语句的 NodeJS 顺序异步

nodejs知识结构

JS中事件以及语句运行顺序的问题

鼠标事件执行顺序

VB事件的执行顺序

Nodejs基础(5-6)HTTP概念进阶