Comment partagez-vous un EventEmitter dans node.js?

Je veux émettre des événements d'un fichier / module / script et les écouter dans un autre fichier / module / script. Comment puis-je partager la variable d'émetteur entre eux sans polluer l'espace de noms global?

Merci!

21
demandé sur fancy 2012-05-19 00:26:50

3 réponses

Vous pouvez passer des arguments pour exiger des appels ainsi:

var myModule = require('myModule')(Events)

, puis dans "myModule"

module.exports = function(Events) {
    // Set up Event listeners here
}

Cela dit, si vous voulez partager un émetteur d'événement, créez un objet émetteur, puis passez à votre "fichier / module / script" dans un appel require.

Mise à jour:

Bien que correct, c'est une odeur de code car vous couplez maintenant étroitement les modules ensemble. Au lieu de cela, envisagez d'utiliser un bus d'événements centralisé qui peut être requis dans chaque module.

15
répondu srquinn 2014-12-15 16:29:11

@srquinn est correct, vous devez utiliser une seule instance partagée:

EventBus.js:

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('uncaughtException', function (err) {
    console.error(err);
});

module.exports = emitter;

Utilisation:

var bus = require('../path/to/eventBus');

// Register event listener
bus.on('eventName', function () {
    console.log('triggered!');
});

// Trigger the event somewhere else
bus.emit('eventName');
15
répondu Omer Leshem 2016-09-25 17:22:54

Pourquoi ne pas utiliser L'EventEmitter de l'objet global process?

process.on('customEvent', function(data) {
  ...
});

process.emit('customEvent', data);

Pro: vous pouvez désactiver ou supprimer complètement un module (par exemple un tracker), sans supprimer tout votre code de suivi dans vos itinéraires. Je fais exactement cela pour node-trackable .

Con: Je ne le fais pas maintenant, mais faites-le moi savoir si vous voyez une prise ici ; -)

12
répondu Sascha Reuter 2013-02-07 14:22:47