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

时间:2017-01-13 21:41:27

标签: node.js design-patterns event-handling eventemitter

我想要一个或多个文件发出事件和多个其他文件来监听它。他们应该共享同一个实例。这就是我试图做的事情

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

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

    我在requireeventGenerator.js中使用listenEvent.s并在eventEmitter.js中导出对象,我希望它遵循单身模式并且他们共享同一个实例。

    以下是一些资源我在发布之前检查了一下。 免责声明:我已经从这些文件中调整了一些设计/代码进行测试。

    以下是三个文件。

    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 event\n");
    
    }, 3000);
    

    listenEvent.js

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

    问题

    • listenEvent.js未收到该活动并立即退出。
    • 如果我发出并侦听同一个文件,它可以正常工作。
    • 看起来listenEvent.jseventGenerator.js具有em对象的不同实例。为什么会这样?

    我在这里错过了一些小事吗?

    提前致谢!

2 个答案:

答案 0 :(得分:0)

回答我自己的问题 - 我能够使用不同的方法 - 使用全局变量。 我仍然无法用其他方法找出问题。 这是3个文件

eventEmitter.js

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

eventGenerator.js

setInterval(function () {

       universalEmitter.emit('Hello');
       console.log('emitting event\n');

}, 2000);

listenEvent.js

require('./emitEvent');
require('./listenEvent');

universalEmitter.on('Hello',function(){
    console.log('received hello\n');
});

答案 1 :(得分:0)

我也遇到了同样的问题。解析JavaScript文件似乎是一个事件。 TBH我不知道它在技术上有多正确。

因此,在运行代码时,Node引擎需要解析EventEmitter函数以及自定义的发射器和侦听器。如果未在应发出的时间之前对其进行解析,则节点将永远不会知道存在任何此类代码。

就我而言,发射器处于正常代码流中。但是,侦听器位于一个单独的文件中,该文件从未导入(或可以说使用)。因此,Node从未解析它,即使事件被触发,也没有被监听。

为解决此问题,我使用了订阅方法,以确保在第一次发出侦听器之前对其进行解析。

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

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

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

此示例未显示完成此操作的理想方法。但是,应该让您知道如何实现它。