跨模块共享事件
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
为简单起见,我创建了一些小文件来测试这个想法。基本上我正在寻找一种在模块上发出和事件然后在主文件中拾取的方法
这是 运行 应用
调用的主文件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