2017-01-13 5 views
0

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

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

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

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

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

Заранее благодарен!

ответ

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'); 
}); 
Смежные вопросы