【问题标题】:Order of execution of statements in Nodejs event emitter programNodejs事件发射器程序中语句的执行顺序
【发布时间】: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。并且,事件发射器函数被同步调用。另外,如果事件发射器函数真的是以同步方式执行的,为什么所有控制台日志都在最后打印出来?

【问题讨论】:

    标签: node.js asynchronous synchronous eventemitter order-of-execution


    【解决方案1】:

    Nodejs 文档说

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

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

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

    【讨论】:

    • 感谢您的帮助,但是,您的回答不适用于这里,因为我第二次使用 removeAllListeners,而不是 removeListener。问题仍然存在......为什么“来自 fun2 的消息:事件发生”被打印出来,为什么所有控制台日志都在最后执行?
    • 突出显示文本的最后一段回答了您的问题。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2013-05-18
    • 1970-01-01
    • 2021-04-27
    • 2012-05-28
    • 2014-08-23
    • 2018-10-16
    相关资源
    最近更新 更多