Ricerca…


Osservazioni

Quando un evento "spara" (che equivale a "pubblicare un evento" o "emettere un evento"), ciascun listener verrà chiamato in modo sincrono ( sorgente ), insieme ai dati di accompagnamento che sono stati passati a emit() , no importa quanti argomenti passi in:

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

Gli ascoltatori verranno chiamati nell'ordine in cui sono stati registrati:

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.

Ma se hai bisogno di un ascoltatore per sparare prima, prima di tutti gli altri listener che sono già stati aggiunti, puoi usare prependListener() modo:

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

Se hai bisogno di ascoltare un evento, ma vuoi sentirlo solo una volta, puoi usare once invece di on o prependOnceListener invece di prependListener . Dopo che l'evento è stato attivato e il listener viene chiamato, il listener verrà automaticamente rimosso e non verrà richiamato la volta successiva che l'evento viene attivato.

Infine, se vuoi rimuovere tutti gli ascoltatori e ricominciare da capo, sentiti libero di fare proprio questo:

myDog.removeAllListeners()

Analisi HTTP tramite un emettitore di eventi

Nel codice del server HTTP (es. 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

Nel codice supervisore (es. 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}`)
})

Ogni volta che il server riceve una richiesta, emetterà un evento chiamato request che il supervisore sta ascoltando, e quindi il supervisore può reagire all'evento.

Nozioni di base

Gli emettitori di eventi sono incorporati nel nodo e sono per pub-sub, un modello in cui un editore emetterà eventi, a cui gli abbonati possono ascoltare e reagire. In gergo Node, gli editori sono chiamati Emettitori di eventi e emettono eventi, mentre gli abbonati sono chiamati ascoltatori e reagiscono agli eventi.

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

Nell'esempio precedente, il cane è l'editore / EventEmitter, mentre la funzione che controlla l'elemento è l'utente / ascoltatore. Puoi anche fare più ascoltatori:

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

Possono anche esserci più ascoltatori per un singolo evento e persino rimuovere gli ascoltatori:

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

Se vuoi ascoltare un evento solo una volta, puoi usare:

myDog.once('chew', pet);

Che rimuoverà l'ascoltatore automaticamente senza condizioni di gara.

Ottieni i nomi degli eventi a cui sei iscritto

La funzione EventEmitter.eventNames () restituirà un array contenente i nomi degli eventi attualmente sottoscritti.

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

Esegui in RunKit

Ottieni il numero di ascoltatori registrati per ascoltare un evento specifico

La funzione Emitter.listenerCount (eventName) restituirà il numero di listener che sono attualmente in ascolto per l'evento fornito come argomento

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow