4

我正在尝试从一个 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');

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

4

2 回答 2

7

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

你打电话时:

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');
于 2013-07-12T18:14:31.740 回答
-1

另一个答案不能发出带有 arguments的事件。所以这里是改进:

'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;
于 2017-07-05T02:08:18.167 回答