Node.js:在多个文件之间共享一个对象



我希望一个或多个文件发出事件,多个其他文件监听事件。它们应该共享同一个实例。这就是我试图做的

要测试代码,我有3个文件

  1. eventEmitter.js-这将创建一个新的EventEmitter对象并将其导出
  2. eventGenerator.js-使用emitEvent.js发出事件
  3. listenEvent.js-使用emitEvent.js侦听事件

我在eventGenerator.jslistenEvent.js中使用require,并在eventEmitter.js中导出对象,我希望它遵循单例模式,并且它们共享相同的实例。

这里有一些资源我在发布之前已经签出了。免责声明:我已经从这些文件中修改了一些设计/代码进行测试。

另一个源文件中的node.js事件侦听器
  • nodejs中的Singleton模式-需要它吗
  • node.js eventEmitter:跨文件侦听事件
  • 其他模块中的节点事件发射器
  • 这是三个文件。

    eventEmitter.js

    //eventEmitter.js
    var events = require('events');
    var em = new events.EventEmitter();
    module.exports.universalEmitter = em;
    

    eventGenerator.js

    //eventGenerator.js
    var eventEMitter = require('./eventEmitter.js');
    var universalEmitter = eventEmitter.universalEmitter;
    setInterval(function () {
    
    universalEmitter.emit('Hello');
    console.log("emitting eventn");
    
    }, 3000);
    

    listenEvent.js

    //listenEvent.js
    var eventEmitter = require('./eventEmitter.js');
    var universalEmitter = eventEmitter.universalEmitter;
    universalEmitter.on('Hello',function(){
    console.log('received hellon');
    }); 
    

    问题

    • listenEvent.js未接收到事件并立即退出
    • 如果我在同一个文件上发射和监听,它工作得很好
    • 看起来listenEvent.jseventGenerator.js具有不同的em对象实例。为什么会发生这种情况

    我是不是遗漏了一些琐碎的东西?

    提前感谢!

    在回答我自己的问题时,我用了一种不同的方法——使用全局变量我仍然无法用另一种方法解决这个问题。这是的3个文件

    eventEmitter.js

    var events = require('events');
    global.universalEmitter = new events();
    

    eventGenerator.js

    setInterval(function () {
    universalEmitter.emit('Hello');
    console.log('emitting eventn');
    }, 2000);
    

    listenEvent.js

    require('./emitEvent');
    require('./listenEvent');
    universalEmitter.on('Hello',function(){
    console.log('received hellon');
    });
    

    我也遇到过同样的问题。这似乎是解析JavaScript文件时发生的意外。TBH我不知道它在技术上有多正确。

    因此,当您运行代码时,EventEmitter函数以及自定义发射器和侦听器需要由Node引擎进行解析。若在应该发出的时候并没有对其进行解析,则节点永远不会知道存在任何此类代码。

    在我的例子中,发射器处于正常的代码流中。但是侦听器位于一个单独的文件中,该文件从未导入(或者您可以说已使用)。所以Node从未解析过它,即使事件被触发,它也没有被监听。

    为了解决这个问题,我使用了订阅方法,以确保侦听器在第一次发出之前得到解析。

    //eventGenerator.js
    import listenEvent from '..listenEvent';
    .....//SomeCode
    listenEvent.register(eventEmitter) 
    .....//SomeCode
    setInterval(function () {
    universalEmitter.emit('Hello');
    console.log("emitting eventn");
    }, 3000);
    

    因此,在发出事件之前,如果侦听器中的方法被调用,则会对其进行解析,并为节点引擎所知。

    //listenEvent.js
    export let register = (eventEmitter) => {
    //Your listener Code
    }
    

    这个例子并没有显示理想的方法来做到这一点。然而,应该给你可以做什么来实现它的想法。

    相关内容

    • 没有找到相关文章

    最新更新