Подтвердить что ты не робот

Как вы совместно используете EventEmitter в node.js?

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

Спасибо!

4b9b3361

Ответ 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 глобального объекта процесса?

process.on('customEvent', function(data) {
  ...
});

process.emit('customEvent', data);

Pro: вы можете отключить или полностью удалить модуль (например, трекер), не удаляя весь ваш код отслеживания в ваших маршрутах. Я делаю именно это для node-trackable.

Con: Я не сейчас, но, пожалуйста, дайте мне знать, если вы видите уловку здесь; -)