Szukaj…


Uwagi

Kiedy zdarzenie „odpala” (co oznacza to samo co „publikowanie zdarzenia” lub „emitowanie zdarzenia”), każdy detektor zostanie wywołany synchronicznie ( źródło ), wraz z wszelkimi danymi towarzyszącymi, które zostały przekazane do emit() , nie ważne, ile argumentów przekażesz:

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

Słuchacze zostaną wezwani w kolejności, w jakiej zostali zarejestrowani:

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.

Ale jeśli potrzebujesz najpierw detektora, zanim wszystkie inne detektory, które już zostały dodane, możesz użyć prependListener() sposób:

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

Jeśli chcesz słuchać ze zdarzeniem, ale tylko chce słyszeć o tym raz, można użyć once zamiast on , lub prependOnceListener zamiast prependListener . Po uruchomieniu zdarzenia i wywołaniu detektora, detektor zostanie automatycznie usunięty i nie będzie wywoływany ponownie przy następnym uruchomieniu zdarzenia.

Wreszcie, jeśli chcesz usunąć wszystkich słuchaczy i zacząć od nowa, możesz to zrobić:

myDog.removeAllListeners()

Analiza HTTP za pośrednictwem emitera zdarzeń

W kodzie serwera HTTP (np. 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

W kodzie nadzorcy (np. 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}`)
})

Za każdym razem, gdy serwer otrzyma żądanie, wyemituje zdarzenie zwane request którego oczekuje przełożony, a następnie przełożony może zareagować na zdarzenie.

Podstawy

Emitery zdarzeń są wbudowane w Węzeł i są przeznaczone dla sub-pubów, co jest wzorcem, w którym wydawca emituje zdarzenia, na które subskrybenci mogą słuchać i reagować. W żargonie Node wydawcy nazywani są emiterami zdarzeń i emitują zdarzenia, a subskrybenci nazywani są słuchaczami i reagują na zdarzenia.

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

W powyższym przykładzie pies jest wydawcą / EventEmitter, a funkcją sprawdzającą element był subskrybent / słuchacz. Możesz też zwiększyć liczbę słuchaczy:

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

Może istnieć wiele detektorów dla jednego zdarzenia, a nawet usuwać detektory:

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

Jeśli chcesz odsłuchać wydarzenie tylko raz, możesz użyć:

myDog.once('chew', pet);

Co spowoduje automatyczne usunięcie słuchacza bez warunków wyścigu.

Uzyskaj nazwy wydarzeń, które są subskrybowane

Funkcja EventEmitter.eventNames () zwróci tablicę zawierającą nazwy zdarzeń aktualnie subskrybowanych.

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

Uruchom w RunKit

Uzyskaj liczbę słuchaczy zarejestrowanych do nasłuchiwania określonego zdarzenia

Funkcja Emitter.listenerCount (eventName) zwróci liczbę detektorów, które aktualnie nasłuchują zdarzenia podanego jako 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow