简体   繁体   English

跨模块共享事件

[英]Sharing event across modules

For simplicity I have create some small files to test out the idea. 为简单起见,我创建了一些小文件来测试这个想法。 Basically i'm looking for a way to emit and event on a module then have that picked up back in the main file for example 基本上我正在寻找一种方法来发射模块上的事件和事件,然后在主文件中找回它,例如

This is the main file called to run the app 这是运行应用程序的主要文件

main.js main.js

var test = require('./test')
var emitter = require('./emitter')
var emit = new emitter()

emit.on('response', function(data) {
    console.log(data)
})

This is where the event is fired 这是事件被触发的地方

fire.js fire.js

var emitter = require('./emitter')
var emit = new emitter

var Test = function() {
    emit.sendEvent('response', 'test')
}


module.exports = Test

Here is the module created to handle the firing of events for the application 以下是为处理应用程序事件触发而创建的模块

emitter.js 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

As can be seen in the emitter.js I have it setup to be able to emit any custom type including data parsed. emitter.js可以看到我设置它能够发出任何自定义类型,包括解析的数据。

I cannot seem to pick this up in the initial main.js file. 我似乎无法在最初的main.js文件中选择它。 However if I place emit.sendEvent('response', 'banana') in the main.js at the bottom of the file it is picked up by the listener above. 但是,如果我将emit.sendEvent('response', 'banana')放在文件底部的main.js中,它将由上面的监听器拾取。 This would indicate that my emitter.js is working correctly. 这表明我的emitter.js正常工作。

Any ideas as to why the event emitted in fire.js isn't being picked up would be great. 关于为什么fire.js发出的事件没有被提取的任何想法都会很棒。

This is because "emit" object in fire.js and "emit" object in main.js are two completely different objects, so subscribing to events from one will not catch events from another. 这是因为fire.js中的“emit”对象和main.js中的“emit”对象是两个完全不同的对象,因此从一个对象中订阅事件不会捕获来自另一个的事件。

What you can do is to export global emitter and use it everywhere. 您可以做的是导出全局发射器并在任何地方使用它。 For example: 例如:

emitter.js 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
};

This way you can use global event object in all of your modules : 这样,您可以在所有模块中使用全局事件对象:

main.js main.js

var test = require('./test')
var emitter = require('./emitter')

emitter.eventBus.on('response', function(data) {
    console.log(data)
})

fire.js 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