2016-06-20 195 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

非常感謝您,我一直在爲此奮鬥了幾天,感覺這與每次實例化對象有關,意味着沒有繼承。 –