Gerard Downes
Gerard Downes

Reputation: 643

Node EventEmitter to EventEmitter emits. Multiple emitters

I am trying to emit from one EventEmitter to another EventEmitter, or find an alternative solution. 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.

Upvotes: 5

Views: 4867

Answers (2)

ch271828n
ch271828n

Reputation: 17643

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;

Upvotes: -1

MobA11y
MobA11y

Reputation: 18900

The issue is that the two EventEmitters are separate objects.

When you call:

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

You’re creating two separate EventEmitter objects. 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. 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. And its use is very simple.

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

Upvotes: 8

Related Questions