另一个源文件中的node.js事件侦听器

Rah*_*uly 7 event-handling node.js eventemitter

我正在尝试设计一个场景,在特定事件被触发时,我想让一些听众执行一些任务.试图管理代码的SRP,我希望将侦听器放在不同的源文件中.我想知道使用事件Emitter是否可行.事件发射器只能在单个源文件上工作吗?

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);
    }); 
};
Run Code Online (Sandbox Code Playgroud)

我的其他源文件是

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

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

gib*_*son 10

您创建的每个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;
Run Code Online (Sandbox Code Playgroud)

但是如果你想让源文件互相"知道" - 你可以这样做:

//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);
});
Run Code Online (Sandbox Code Playgroud)