Как вы совместно используете EventEmitter в node.js?
Я хочу выпустить события из одного файла/модуля/ script и прослушать их в другом файле/модуле/script. Как я могу совместно использовать переменную эмиттера между ними, не загрязняя глобальное пространство имен?
Спасибо!
Ответ 1
Вы можете передать аргументы, чтобы запросить вызовы:
var myModule = require('myModule')(Events)
И затем в "myModule"
module.exports = function(Events) {
// Set up Event listeners here
}
С учетом сказанного, если вы хотите поделиться эмитентом событий, создайте объект-эмиттер, а затем перейдите в свой "файл/модуль/ script" в требуемом вызове.
Обновление:
Хотя правильно, это запах кода, поскольку вы теперь плотно соединяете модули вместе. Вместо этого рассмотрите возможность использования централизованной шины событий, которая может потребоваться в каждом модуле.
Ответ 2
@srquinn верен, вы должны использовать общий один экземпляр:
eventBus.js:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('uncaughtException', function (err) {
console.error(err);
});
module.exports = emitter;
Применение:
var bus = require('../path/to/eventBus');
// Register event listener
bus.on('eventName', function () {
console.log('triggered!');
});
// Trigger the event somewhere else
bus.emit('eventName');
Ответ 3
Почему бы не использовать EventEmitter глобального объекта процесса?
Pro: вы можете отключить или полностью удалить модуль (например, трекер), не удаляя весь ваш код отслеживания в ваших маршрутах. Я делаю именно это для node-trackable.
Con: Я не сейчас, но, пожалуйста, дайте мне знать, если вы видите уловку здесь; -)