Узел.js: совместное использование объекта между несколькими файлами

Я хочу, чтобы один или несколько файлов испускали события и несколько других файлов, чтобы слушать его. Они должны использовать один и тот же экземпляр. Это то, что я пытался сделать

Для тестирования кода у меня есть 3 файла

  1. eventEmitter.js — это создает новый EventEmitterобъект и экспортирует его
  2. eventGenerator.js — это испускает события, используя emitEvent.js
  3. listenEvent.js — это прослушивает события с помощью emitEvent.js

Я использую requireeventGenerator.jslistenEvent.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 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.jsи eventGenerator.jsимеет различные экземпляры emобъекта. Почему это происходит?

Я упускаю что-то тривиальное?

Заранее спасибо!

1 ответ

  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');
    });