【问题标题】:Sharing event across modules跨模块共享事件
【发布时间】:2016-06-20 18:31:38
【问题描述】:

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

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

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 中发出的事件没有被拾取的任何想法都会很棒。

【问题讨论】:

    标签: javascript node.js eventemitter


    【解决方案1】:

    这是因为 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
    

    【讨论】:

    • 非常感谢,我已经为此奋斗了几天,我感觉这与每次实例化的对象有关,这意味着没有继承。
    猜你喜欢
    • 2012-10-31
    • 2012-09-19
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多