繁体   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