【问题标题】:Node.js: Sharing an object between multiple filesNode.js:在多个文件之间共享一个对象
【发布时间】:2017-05-29 08:55:40
【问题描述】:

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

为了测试代码,我有 3 个文件

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

我在eventGenerator.jslistenEvent.js 中使用require 并在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 对象实例。为什么会这样?

我在这里错过了一些琐碎的事情吗?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    回答我自己的问题 - 我能够用不同的方法让它工作 - 使用全局变量。 我仍然无法找出其他方法的问题。 这是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');
    });
    

    【讨论】:

      【解决方案2】:

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

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

      在我的例子中,发射器处于正常的代码流中。但是侦听器位于一个单独的文件中,该文件从未导入(或者您可以说使用过)。所以 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
      }
      

      这个例子并没有给出理想的方法。但是,应该让您知道可以做些什么来实现它。

      【讨论】:

        猜你喜欢
        • 2012-07-22
        • 2017-10-04
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        相关资源
        最近更新 更多