Sök…


Anmärkningar

När en händelse "avfyras" (vilket betyder samma sak som "publicera en händelse" eller "avge en händelse") kommer varje lyssnare att kallas synkront ( källa ), tillsammans med alla medföljande data som har skickats in för att emit() , nej oavsett hur många argument du skickar in:

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

Lyssnarna kommer att ringas i den ordning de registrerades:

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.

Men om du behöver en lyssnare för att avfyra först, innan alla andra lyssnare som redan har lagts till, kan du använda prependListener() så:

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

Om du behöver lyssna på en händelse, men bara vill höra om den en gång, kan du använda en once istället för on , eller prependOnceListener istället för prependListener . Efter att evenemanget har skjutits ut och lyssnaren kommer att ringas, tas lyssnaren automatiskt bort och kommer inte att ringas igen nästa gång evenemanget avfyras.

Slutligen, om du vill ta bort alla lyssnare och börja om igen, känn dig fri att göra just det:

myDog.removeAllListeners()

HTTP Analytics via en Event Emitter

I HTTP- server.js (t.ex. 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

I handledarkod (t.ex. 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}`)
})

När servern får en begäran kommer den att avge en händelse som kallas request som handledaren lyssnar på och sedan kan handledaren reagera på händelsen.

Grunderna

Event Emitters är inbyggda i Node och är för pub-sub, ett mönster där en förläggare kommer att avge händelser, som prenumeranter kan lyssna på och reagera på. I Node-jargon kallas förlag Event Emitters , och de avger händelser, medan prenumeranter kallas lyssnare , och de reagerar på händelserna.

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

I exemplet ovan är hunden utgivaren / EventEmitter, medan funktionen som kontrollerar objektet var abonnenten / lyssnaren. Du kan också göra fler lyssnare:

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

Det kan också finnas flera lyssnare för en enda händelse och till och med ta bort lyssnare:

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

Om du bara vill lyssna på en händelse en gång kan du använda:

myDog.once('chew', pet);

Vilket tar bort lyssnaren automatiskt utan tävlingsförhållanden.

Få namnen på de händelser som prenumererar på

Funktionen EventEmitter.eventNames () returnerar en matris med namnen på de händelser som för närvarande prenumererar på.

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

Kör i RunKit

Få antalet lyssnare registrerade för att lyssna på ett specifikt evenemang

Funktionen Emitter.listenerCount (eventName) returnerar antalet lyssnare som för närvarande lyssnar på händelsen som anges som 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow