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事件发射器程序中语句的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章