javascript - 跨模块共享事件

标签 javascript node.js eventemitter

为简单起见,我创建了一些小文件来测试这个想法。基本上我正在寻找一种在模块上发出和事件然后在主文件中拾取的方法,例如

这是运行应用程序调用的主文件

ma​​in.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
};

这样您就可以在所有模块中使用全局事件对象:

ma​​in.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

关于javascript - 跨模块共享事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929429/

相关文章:

mysql - 从选择创建转储文件

javascript - Node : When subclassing an existing subclass of EventEmitter, 我如何拦截来自父类(super class)的事件?

javascript - 迭代数组时未定义“长度”属性

javascript - 如果我只想选择MP3,为什么HTML `<input type=“file”/>` accept property `音频/mpeg和 `audio/mp3`可以相同?

javascript - jQuery.attr() 和 data() 总是返回未定义

javascript - 捕获我导出的 async/await 函数的错误

javascript - XMLHttpRequest 不发送 POST 数据

javascript - 来自 node.js 服务器的 Ajax POST

node.js - node js中event.on()和event.once()的区别

javascript - 从指令发出事件时, Angular 事件发射器不工作