在模块之间共享事件

为了简单起见,我创build了一些小文件来testing这个想法。 基本上,我正在寻找一种方式来发射和事件的模块,然后在主文件中拿起例如

这是调用运行应用程序的主要文件

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 

这里是创build的模块来处理应用程序事件触发

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可以看到,我已经设置为能够发出任何自定义types,包括parsing的数据。

我似乎无法在最初的main.js文件中select它。 但是,如果我在文件底部的main.js中放置emit.sendEvent('response', 'banana') ,它将被上面的监听器拾取。 这将表明我的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