Zoeken…


Opmerkingen

Wanneer een gebeurtenis "vuurt" (wat hetzelfde betekent als "een gebeurtenis publiceren" of "een gebeurtenis uitzenden"), wordt elke luisteraar synchroon aangeroepen ( bron ), samen met eventuele bijbehorende gegevens die werden doorgegeven aan emit() , nee maakt uit hoeveel argumenten je doorgeeft:

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

De luisteraars worden gebeld in de volgorde waarin ze zijn geregistreerd:

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.

Maar als je eerst een luisteraar nodig hebt om te vuren, voordat alle andere luisteraars die al zijn toegevoegd, kun je prependListener() als volgt gebruiken:

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

Als u naar een gebeurtenis wilt luisteren, maar u wilt er maar één keer over horen, kunt u once gebruiken once plaats van on of prependOnceListener plaats van prependListener . Nadat het evenement is geactiveerd en de luisteraar wordt gebeld, wordt de luisteraar automatisch verwijderd en wordt de volgende keer dat het evenement wordt geactiveerd niet opnieuw gebeld.

Als u ten slotte alle luisteraars wilt verwijderen en opnieuw wilt beginnen, kunt u dat ook doen:

myDog.removeAllListeners()

HTTP Analytics via een Event Emitter

In de HTTP-servercode (bijv. 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

In supervisor-code (bijv. 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}`)
})

Wanneer de server een verzoek ontvangt, verzendt deze een gebeurtenis met de naam request waarnaar de supervisor luistert, waarna de supervisor op de gebeurtenis kan reageren.

Basics

Evenementzenders zijn ingebouwd in Node, en zijn voor pub-sub, een patroon waar een uitgever evenementen uitzendt, waarnaar abonnees kunnen luisteren en waarop ze kunnen reageren. In Node-jargon worden uitgevers Event Emitters genoemd en zenden ze evenementen uit, terwijl abonnees luisteraars worden genoemd en ze reageren op de evenementen.

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

In het bovenstaande voorbeeld is de hond de uitgever / EventEmitter, terwijl de functie die het item controleert de abonnee / luisteraar was. Je kunt ook meer luisteraars maken:

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

Er kunnen ook meerdere luisteraars zijn voor een enkele gebeurtenis en zelfs luisteraars verwijderen:

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

Als je slechts één keer naar een evenement wilt luisteren, kun je het volgende gebruiken:

myDog.once('chew', pet);

Die de luisteraar automatisch verwijdert zonder race-omstandigheden.

Haal de namen op van de evenementen waarop u bent geabonneerd

De functie EventEmitter.eventNames () retourneert een array met de namen van de evenementen waarop momenteel is geabonneerd.

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"]

Uitvoeren in RunKit

Krijg het aantal geregistreerde luisteraars om naar een specifiek evenement te luisteren

De functie Emitter.listenerCount (eventName) retourneert het aantal luisteraars dat momenteel luistert naar de gebeurtenis als 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow