Node.js
Émetteurs d'événements
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"]
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