прослушиватель событий node.js в другом исходном файле

Я пытаюсь разработать сценарий, в котором при запуске определенного события я хотел, чтобы несколько слушателей выполняли какую-то задачу. Пытаясь также управлять кодом SRP, я хочу, чтобы слушатели находились в другом исходном файле. Я хочу знать, возможно ли это с помощью эмиттера событий. Генератор событий работает только с одним исходным файлом?

var events = require('events');
var em = new events.EventEmitter();

exports.saveScheme = function (req, res) {  

var dal = dalFactory.createDAL(constants.SCHEME);
return new Promise.resolve(dal.PromiseSave(req.body))
    .then(function(data){
        var schemeId = data._id;

        em.addListener('FirstEvent', function (data) {
            console.log('First subscriber: ' + data);
        });
        em.emit('FirstEvent', 'Test event emitter');

    }).catch(function(error){
        console.log(error);
    }); 
};

Другой мой исходный файл

var emitter = require('events').EventEmitter;
var em = new emitter();

//Subscribe FirstEvent
em.on('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});

person Rahul Ganguly    schedule 11.05.2016    source источник


Ответы (3)


Каждый объект eventEmitter, который вы создаете, является новым экземпляром, поэтому события, запущенные из первого, не будут запускаться во втором, поэтому ответ на ваш вопрос - нет, это невозможно. Однако есть и другие решения:

Я думаю, что лучше всего создать централизованный общий eventEmitter, например:

//firstFile.js
var common = require('./common');
var commonEmitter = common.commonEmitter;

exports.saveScheme = function (req, res) {  

var dal = dalFactory.createDAL(constants.SCHEME);
return new Promise.resolve(dal.PromiseSave(req.body))
    .then(function(data){
        var schemeId = data._id;

        commonEmitter.addListener('FirstEvent', function (data) {
            console.log('First subscriber: ' + data);
        });
        commonEmitter.emit('FirstEvent', 'Test event emitter');

    }).catch(function(error){
        console.log(error);
    }); 
};



//secondFile.js
var common = require('./common');
var commonEmitter = common.commonEmitter;

//Subscribe FirstEvent
commonEmitter.on('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});


//common.js
var events = require('events');
var em = new events.EventEmitter();
module.exports.commonEmitter = em;

Но если вы хотите, чтобы исходный файл «знал» друг друга — вы можете сделать что-то вроде этого:

//firstFile.js
var events = require('events');
var em = new events.EventEmitter();

exports.saveScheme = function (req, res) {  

var dal = dalFactory.createDAL(constants.SCHEME);
return new Promise.resolve(dal.PromiseSave(req.body))
    .then(function(data){
        var schemeId = data._id;

        em.addListener('FirstEvent', function (data) {
            console.log('First subscriber: ' + data);
        });
        em.emit('FirstEvent', 'Test event emitter');

    }).catch(function(error){
        console.log(error);
    }); 
};
exports.emitter = em;



//secondFile.js
var firstFile = require('./firstFile');
var firstFileEmitter = firstFile.emitter;

//Subscribe FirstEvent
firstFileEmitter.on('FirstEvent', function (data) {
    console.log('First subscriber: ' + data);
});
person gibson    schedule 11.05.2016
comment
Большое спасибо за понимание. - person Rahul Ganguly; 11.05.2016
comment
Привет, Гилад, я попробовал пример 2, я создал 2 файла js без какой-либо логики, просто сделал и em.emit и сделал export.emitter. Во втором файле я не делал никаких изменений. Журнал console.log второго файла не вызывался. Любая идея о том, что мне не хватало - person Rahul Ganguly; 11.05.2016
comment
Не могли бы вы как-нибудь прикрепить свой код (в виде комментария или в новом вопросе)? - person gibson; 11.05.2016
comment
Я не мог поместить это в комментарий, поэтому я добавил его как ответ ниже - person Rahul Ganguly; 11.05.2016

Прослушиватель событий и эмиттер могут находиться в двух разных файлах. См. простой пример ниже:

Первый файл, назовем его eventEx.js.

 var EventEmitter = require('events').EventEmitter

   var myEmitter = new EventEmitter();

   myEmitter.on('print', (arg) => {
    console.log(arg);
   })

   exports.myEmitter = myEmitter

И второй файл выглядит следующим образом:

var emitter = require('./eventEx.js')
var printEmitter = emitter.myEmitter

printEmitter.emit('print', 'how was Dunkirk?')
printEmitter.emit('print', 'Dunkirk was awesome!!')
person Elf    schedule 21.08.2017
comment
но вы импортируете eventex в другой файл, решение состоит в том, что есть 2 файла, которые не импортируют друг друга, но имеют общий источник событий между ними, возможно ли это - person PirateApp; 13.04.2019

Вот как я использую в своем тестировании. Я использую его с семантикой класса

Следует отметить одно предостережение: всегда необходимо регистрировать прослушиватель перед отправкой события, потому что при отправке события оно ищет уже зарегистрированный набор слушателей, а затем передает туда поток.

//emitter.js
// The core module events has EventEmitter class which we are going to make use of
// note that we are not going to use that explicitly but by means of another class

const EventEmitter = require('events');

Class EventEmitterClass extends EventEmitter{
    emitterMethod(){
      this.emit('testEventEmitted', {obj:'testString object'});
    }
}

module.exports = EventEmitterClass; // we export the module with the objectInstance

//listener.js
// now import the emitter.js and we get back a class - EventEmitterClass
const EventEmitterClass = require('./emitter.js');//give the actual path of js
const eventEmitterObj = new EventEmitterClass();

//now it is mandatory to register the listener before we even think of calling the //emitter method
eventEmitterObj.addListener('testEventEmitted', res => {
   console.log('this is the result from the emitted event:', res);
});

//now call the method that emits the event in the class
eventEmitterObj.emitterMethod();

Теперь запустите listener.js -> node listerner.js

Извините, если я слишком подробно объяснил

person vijayakumarpsg587    schedule 13.11.2018