Recherche…


Remarques

Lorsqu'un événement "se déclenche" (ce qui signifie la même chose que "publier un événement" ou "émettre un événement"), chaque écouteur sera appelé de manière synchrone ( source ), avec toutes les données d'accompagnement transmises à emit() , non Peu importe le nombre d’arguments que vous transmettez:

myDog.on('bark', (howLoud, howLong, howIntense) => {
  // handle the event
})
myDog.emit('bark', 'loudly', '5 seconds long', 'fiercely')

Les auditeurs seront appelés dans l'ordre dans lequel ils ont été enregistrés:

myDog.on('urinate', () => console.log('My first thought was "Oh-no"'))
myDog.on('urinate', () => console.log('My second thought was "Not my lawn :)"'))
myDog.emit('urinate')
// The console.logs will happen in the right order because they were registered in that order.

Mais si vous avez besoin d'un écouteur pour lancer en premier, avant que tous les autres écouteurs déjà ajoutés, vous pouvez utiliser prependListener() comme ceci:

myDog.prependListener('urinate', () => console.log('This happens before my first and second thoughts, even though it was registered after them'))

Si vous avez besoin d'écouter un événement, mais vous voulez seulement entendre parler une fois, vous pouvez utiliser once au lieu de on ou prependOnceListener au lieu de prependListener . Après le déclenchement de l'événement et l'appel de l'écouteur, le programme d'écoute sera automatiquement supprimé et ne sera plus appelé lors du prochain déclenchement de l'événement.

Enfin, si vous souhaitez supprimer tous les auditeurs et recommencer, n'hésitez pas à le faire:

myDog.removeAllListeners()

Analyses HTTP via un émetteur d'événements

Dans le code du serveur HTTP (par exemple server.js ):

const EventEmitter = require('events')
const serverEvents = new EventEmitter()

// Set up an HTTP server
const http = require('http')
const httpServer = http.createServer((request, response) => {
  // Handler the request...
  // Then emit an event about what happened
  serverEvents.emit('request', request.method, request.url)
});

// Expose the event emitter
module.exports = serverEvents

En code superviseur (par exemple, supervisor.js ):

const server = require('./server.js')
// Since the server exported an event emitter, we can listen to it for changes:
server.on('request', (method, url) => {
  console.log(`Got a request: ${method} ${url}`)
})

Chaque fois que le serveur reçoit une demande, il émet un événement appelé request que le superviseur écoute, puis le superviseur peut réagir à l'événement.

Les bases

Les émetteurs d'événements sont intégrés au nœud et sont destinés à un sous-groupe, un modèle dans lequel un éditeur émet des événements, auxquels les abonnés peuvent écouter et réagir. Dans le jargon Node, les éditeurs sont appelés émetteurs d’événement et émettent des événements, tandis que les abonnés sont appelés auditeurs et réagissent aux événements.

// Require events to start using them
const EventEmitter = require('events').EventEmitter;
// Dogs have events to publish, or emit
class Dog extends EventEmitter {};
class Food {};

let myDog = new Dog();

// When myDog is chewing, run the following function
myDog.on('chew', (item) => {
  if (item instanceof Food) {
    console.log('Good dog');
  } else {
    console.log(`Time to buy another ${item}`);
  }
});

myDog.emit('chew', 'shoe'); // Will result in console.log('Time to buy another shoe')
const bacon = new Food();
myDog.emit('chew', bacon); // Will result in console.log('Good dog')

Dans l'exemple ci-dessus, le chien est l'éditeur / EventEmitter, tandis que la fonction qui vérifie l'élément est l'abonné / auditeur. Vous pouvez aussi faire plus d'auditeurs:

myDog.on('bark', () => {
  console.log('WHO\'S AT THE DOOR?');
  // Panic
});

Il peut également y avoir plusieurs écouteurs pour un même événement et même supprimer des écouteurs:

myDog.on('chew', takeADeepBreathe);
myDog.on('chew', calmDown);
// Undo the previous line with the next one:
myDog.removeListener('chew', calmDown);

Si vous souhaitez écouter un événement une seule fois, vous pouvez utiliser:

myDog.once('chew', pet);

Qui supprimera automatiquement l'auditeur sans conditions de course.

Obtenez les noms des événements auxquels vous êtes abonné

La fonction EventEmitter.eventNames () renverra un tableau contenant les noms des événements auxquels vous êtes actuellement abonné.

const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}

var emitter = new MyEmitter();

emitter
.on("message", function(){ //listen for message event
    console.log("a message was emitted!");
})
.on("message", function(){ //listen for message event
    console.log("this is not the right message");
})
.on("data", function(){ //listen for data event
    console.log("a data just occured!!");
});

console.log(emitter.eventNames()); //=> ["message","data"]
emitter.removeAllListeners("data");//=> removeAllListeners to data event
console.log(emitter.eventNames()); //=> ["message"]

Exécuter dans RunKit

Obtenir le nombre d'auditeurs inscrits pour écouter un événement spécifique

La fonction Emitter.listenerCount (eventName) renverra le nombre d'écouteurs qui écoutent actuellement l'événement fourni en argument.

const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}
var emitter = new MyEmitter();

emitter
.on("data", ()=>{ // add listener for data event
    console.log("data event emitter");
});

console.log(emitter.listenerCount("data"))    // => 1
console.log(emitter.listenerCount("message")) // => 0

emitter.on("message", function mListener(){ //add listener for message event
    console.log("message event emitted");
});
console.log(emitter.listenerCount("data"))    // => 1
console.log(emitter.listenerCount("message")) // => 1

emitter.once("data", (stuff)=>{ //add another listener for data event
    console.log(`Tell me my ${stuff}`);
})

console.log(emitter.listenerCount("data"))   // => 2
console.log(emitter.listenerCount("message"))// => 1


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow