节点EventEmitter到EventEmitter发出。多个发射器

时间:2013-07-12 18:04:46

标签: javascript node.js eventemitter

我正在尝试从一个EventEmitter发送到另一个EventEmitter,或者找到一个替代解决方案。下面的代码不起作用。

多个发射器示例

var events = require('events');

var eventEmitterOne = new events.EventEmitter();
var eventEmitterTwo = new events.EventEmitter();

eventEmitterTwo.on('fireEvent', function() {
     console.log('event fired');
});

eventEmitterOne.emit('fireEvent');

我正在寻找以下是否可能以及我需要对以下代码进行哪些更改才能使其正常运行。或者是否存在跨多个发射器发射事件的另一种方式。谢谢你的时间。

2 个答案:

答案 0 :(得分:6)

问题是这两个EventEmitter是单独的对象。

致电时:

var eventEmitterOne = new events.EventEmitter();
var eventEmitterTwo = new events.EventEmitter();

您正在创建两个单独的EventEmitter个对象。这意味着当您向一个事件发出事件时,您无法通过在另一个事件上触发事件来触发它们。

您的代码没有任何问题,只是您对应该发生的事情的理解。

我喜欢这样做的方法是将内容包装在我自己的EventEmitter模块中。这样我就有了一个“全局”发射器对象,有一些简单的函数包装器用于发出和注册事件。这允许许多不同的模块共享同一组事件,注册要触发的其他模块的事件,等等。

var eventEmitter = new (require('events').EventEmitter)();

function emitEvent(str) {
    'use strict';
    eventEmitter.emit(str);
}

function registerEvent(str, callback) {
    'use strict';
    eventEmitter.on(str, callback);
}

function registerEventOnce(str, callback) {
    'use strict';
    eventEmitter.once(str, callback);
}

exports.emitEvent = emitEvent;
exports.registerEvent = registerEvent;
exports.registerEventOnce = registerEventOnce;

将上述代码放入名为EventFileName.js的文件中。它的使用非常简单。

var customEventEmitter = require('./EventFileName');
customEventEmitter.registerEvent('fireEvent', someCallback);
customEventEmitter.emitEvent('fireEvent');

答案 1 :(得分:-1)

另一个答案无法使用参数发出事件。所以这是改进:

'use strict';

var eventEmitter = new (require('events').EventEmitter)();

function emitEvent(...args) {
    eventEmitter.emit(...args);
}

function registerEvent(str, callback) {
    eventEmitter.on(str, callback);
}

function registerEventOnce(str, callback) {
    eventEmitter.once(str, callback);
}

exports.emit = emitEvent;
exports.on = registerEvent;
exports.once = registerEventOnce;