简体   繁体   English

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

[英]Node EventEmitter to EventEmitter emits. Multiple emitters

I am trying to emit from one EventEmitter to another EventEmitter, or find an alternative solution. 我试图从一个EventEmitter发射到另一个EventEmitter,或者找到一个替代解决方案。 The code below doesn't function. 下面的代码不起作用。

Multiple emitter example 多发射器示例

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');

I'm looking to find out if the following is possible and whats changes I would need to make to the following code to make it functional. 我正在寻找以下是否可能以及我需要对以下代码进行哪些更改才能使其正常运行。 Or is there another way of emitting events across multiple emitters. 或者是否存在跨多个发射器发射事件的另一种方式。 Thanks for your time. 谢谢你的时间。

The issue is that the two EventEmitter s are separate objects. 问题是两个EventEmitter是单独的对象。

When you call: 你打电话的时候:

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

You're creating two separate EventEmitter objects. 您正在创建两个单独的EventEmitter对象。 This means that when you emit events to one, you cannot trigger them by firing events on the other. 这意味着当您向一个事件发出事件时,您无法通过在另一个事件上触发事件来触发它们。

There's nothing wrong with your code, just your understanding of what should be happening. 您的代码没有任何问题,只是您对应该发生的事情的理解。

The way I like to do this is by wrapping things in my own EventEmitter module. 我喜欢这样做的方法是将东西包装在我自己的EventEmitter模块中。 This way I have a "global" emitter object, with some simple function wrappers for emitting and registering events. 这样我就有了一个“全局”发射器对象,有一些简单的函数包装器用于发出和注册事件。 This allows many different modules to share the same set of events, register events for other modules to fire, and so on. 这允许许多不同的模块共享同一组事件,注册要触发的其他模块的事件,等等。

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;

Just throw the above code into a file called EventFileName.js . 只需将上面的代码放入名为EventFileName.js的文件中EventFileName.js And its use is very simple. 它的使用非常简单。

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

The other answer cannot emit event with arguments . 另一个答案不能用参数发出事件。 So here is the improvement: 所以这是改进:

'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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM