2016-05-11 4 views
2

Я пытаюсь создать сценарий, в котором при запуске определенного события я хотел, чтобы несколько слушателей выполнили какую-то задачу. Пытаясь также управлять кодом S.R.P, я хочу, чтобы слушатели находились в другом исходном файле. Я хочу знать, возможно ли это с помощью события Emitter. Является ли событие эмиттером только для одного исходного файла?node.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); 
    }); 
}; 

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

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

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

ответ

1

Каждый 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; 

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

//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); 
}); 
+0

Благодаря тонну для понимания , –

+0

Привет, Гилад, я попробовал пример 2, я создал 2 файла js без какой-либо логики, просто сделал и em.emit и сделал export.emitter. Во втором файле я не внес никаких изменений. Не удалось вызвать консоль log второго файла. Любая идея о том, что мне не хватало –

+0

Не могли бы вы прикрепить свой код кстати (как комментарий или новый вопрос)? –

0

Мой первый файл

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

module.exports.saveScheme = function (req, res) { 
em.emit('FirstEvent', 'Rahul event emitter'); 
}; 

exports.emitter = em; 

Второй файл:

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


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

Является ли функция saveScheme называемой где-то? –

+0

Да, у нас есть страница, которая вызывает схему сохранения при нажатии кнопки. Я думал о наличии коллекции наблюдателей, которая будет запускаться при нажатии на нее. Но я чувствую, что луч эмиттера лучше будет –

+0

Лучше. на первый взгляд код кажется прекрасным. возможно, попробуйте добавить console.log в функцию saveScheme, и один после того, как второй файл завершит инициализацию, чтобы вы могли видеть порядок вещей. –

2

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

Первый файл, назовем его 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!!') 
Смежные вопросы