簡體   English   中英

跨模塊共享事件

[英]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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM