跨模块共享事件

Sharing event across modules

为简单起见,我创建了一些小文件来测试这个想法。基本上我正在寻找一种在模块上发出和事件然后在主文件中拾取的方法

这是 运行 应用

调用的主文件

main.js

var test = require('./test')
var emitter = require('./emitter')
var emit = new emitter()

emit.on('response', function(data) {
    console.log(data)
})

这是触发事件的地方

fire.js

var emitter = require('./emitter')
var emit = new emitter

var Test = function() {
    emit.sendEvent('response', 'test')
}


module.exports = Test

这是为处理应用程序的事件触发而创建的模块

emitter.js

var util = require('util')
var eventEmitter = require('events').EventEmitter

function Event () {
    eventEmitter.call(this)
}

util.inherits(Event, eventEmitter)

Event.prototype.sendEvent = function(type, data) {
    this.emit(type, data)
}

module.exports = Event

正如在 emitter.js 中看到的那样,我将其设置为能够发出任何自定义类型,包括已解析的数据。

我似乎无法在最初的 main.js 文件中找到它。但是,如果我将 emit.sendEvent('response', 'banana') 放在文件底部的 main.js 中,它会被上面的侦听器拾取。这表明我的 emitter.js 工作正常。

关于 fire.js 中发出的事件为何未被拾取的任何想法都很好。

这是因为fire.js中的"emit"对象和main.js中的"emit"对象是两个完全不同的对象,所以订阅一个的事件不会捕捉到一个的事件其他。

你可以做的是导出全局发射器并在任何地方使用它。 例如:

emitter.js

var util = require('util')
var eventEmitter = require('events').EventEmitter

function Event () {
    eventEmitter.call(this)
}

util.inherits(Event, eventEmitter)

Event.prototype.sendEvent = function(type, data) {
    this.emit(type, data)
}
var eventBus = new Event();
module.exports = {
 emitter : Event,
 eventBus : eventBus
};

这样您就可以在所有模块中使用全局事件对象:

main.js

var test = require('./test')
var emitter = require('./emitter')

emitter.eventBus.on('response', function(data) {
    console.log(data)
})

fire.js

var emitter = require('./emitter')

var Test = function() {
    emitter.eventBus.sendEvent('response', 'test')
}


module.exports = Test