Suche…


Bemerkungen

Wenn ein Ereignis "ausgelöst" wird (was gleichbedeutend mit "Veröffentlichen eines Ereignisses" oder "Ausgeben eines Ereignisses") ist, wird jeder Listener synchron ( Quelle ) zusammen mit den zugehörigen Begleitdaten aufgerufen, die an emit() wurden Egal wie viele Argumente Sie einreichen:

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

Die Hörer werden in der Reihenfolge ihrer Registrierung angerufen:

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.

Wenn Sie jedoch erst einen Listener abfeuern prependListener() , bevor alle anderen Listener bereits hinzugefügt wurden, können Sie prependListener() wie prependListener() :

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

Wenn Sie ein Ereignis anhören möchten, aber nur once prependOnceListener möchten, können Sie once statt on oder prependOnceListener anstelle von prependListener . Nachdem das Ereignis ausgelöst wurde und der Listener aufgerufen wurde, wird der Listener automatisch entfernt und beim nächsten Auslösen des Ereignisses nicht mehr aufgerufen.

Wenn Sie alle Zuhörer entfernen und von vorne beginnen möchten, können Sie genau das tun:

myDog.removeAllListeners()

HTTP Analytics durch einen Ereignisgeber

Im HTTP- server.js (zB 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 (z. B. 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}`)
})

Immer wenn der Server eine Anforderung erhält, gibt er ein Ereignis aus, das als request das der Supervisor wartet. Der Supervisor kann dann auf das Ereignis reagieren.

Grundlagen

Ereignis-Emitters sind in Node integriert und für pub-sub, ein Muster, bei dem ein Publisher Ereignisse auslöst, auf die Abonnenten zuhören und darauf reagieren können. Im Node-Jargon werden Verleger als Event-Emitters bezeichnet . Sie geben Ereignisse aus, während Abonnenten als Listener bezeichnet werden und auf die Ereignisse reagieren.

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

Im obigen Beispiel ist der Hund der Herausgeber / EventEmitter, während die Funktion, die das Element überprüft, der Abonnent / Listener war. Sie können auch mehr Zuhörer machen:

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

Es können auch mehrere Listener für ein einzelnes Ereignis vorhanden sein, und es können sogar Listener entfernt werden:

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

Wenn Sie eine Veranstaltung nur einmal anhören möchten, können Sie Folgendes verwenden:

myDog.once('chew', pet);

Dadurch wird der Listener automatisch ohne Racebedingungen entfernt.

Rufen Sie die Namen der Ereignisse ab, die abonniert werden

Die Funktion EventEmitter.eventNames () gibt ein Array mit den Namen der aktuell abonnierten Ereignisse zurück.

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

Führen Sie RunKit aus

Erhalten Sie die Anzahl der Hörer, die für ein bestimmtes Ereignis registriert sind

Die Funktion Emitter.listenerCount (eventName) gibt die Anzahl der Listener zurück, die aktuell auf das als Argument angegebene Ereignis warten

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow