2016-06-20 162 views
2

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

这就是所谓的运行应用程序

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发出的事件没有被拿起的想法会很好。

回答

4

这是因为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 
+0

非常感谢您,我一直在为此奋斗了几天,感觉这与每次实例化对象有关,意味着没有继承。 –