Node.js
Event-Sender
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"]
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