Hendelsesmittere er objekter i NodeJS som utløser hendelser ved å sende en melding for å signalisere at en handling har skjedd.
Node.js har en innebygd hendelsesmodul. Den inneholder en hendelsessenderklasse som lar deg opprette og håndtere tilpassede hendelser via tilbakeringingsfunksjoner.
Her vil du lære hvordan du sender ut hendelser, lytter og håndterer hendelsesdata og håndterer hendelsesfeil i NodeJS.
Sender ut hendelser
Eventmodulen er en kjernedel av Node.js serversidemiljøet. Dermed trenger du ikke å installere den, men før du bruker EventEmitter klasse, må du importere fra hendelsesmodulen og instansiere den.
Som så:
konst EventEmitter = krever("arrangementer");
// Instantiating EventEmitter
konst minEmitter = ny EventEmitter();
Du kan sende ut hendelser ved å bruke EventEmitter's avgir metode. De avgir metoden tar en arrangementsnavn og et vilkårlig antall argumenter som parametere.
Når du ringer avgir metoden, avgir den bestått arrangementsnavn. Deretter kaller den synkront hver av hendelsens lyttere i den rekkefølgen du registrerte dem, og sender de oppgitte argumentene til hver. Til slutt kommer den tilbake
ekte hvis arrangementet hadde lyttere og falsk hvis den ikke hadde noen lyttere.For eksempel:
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);
I kodeblokken ovenfor bestod du TestEvent som Arrangementsnavn, og "foo,” "bar,” 1, og 2 som argumentene. Når kodeblokken ovenfor kjører, vil den varsle alle lyttere som lytter etter TestEvent begivenhet. Det vil kalle de lytterne med de gitte argumentene.
Lytte etter arrangementer
Du kan lytte etter utsendte hendelser ved å bruke EventEmitter's på metode. De på metoden tar en Arrangementsnavn og en tilbakeringingsfunksjon som parametere. Når arrangementet med Arrangementsnavn gikk over i på metoden sendes ut, påkaller den tilbakeringingsfunksjonen. Denne metoden returnerer en referanse til EventEmitter, slik at du kan lenke flere samtaler.
For eksempel:
// Første lytter
myEmitter.on("TestEvent", () => {
console.log("TestEvent sendt!!!");
}); // TestEvent sendt!!!// Andre lytter
myEmitter.on("TestEvent", (...args) => {
args = args.join(", ");
konsoll.Logg(`Hendelse sendt ut med følgende argumenter: ${args}`);
}); // Hendelse sendt ut med følgende argumenter: foo, bar, 1, 2
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);
I kodeblokken ovenfor, når TestEvent hendelsen sender ut, vil lytterne for hendelsen påkalle tilbakeringingsfunksjonene sine. Lytterne vil reagere i den rekkefølgen du registrerte dem, noe som betyr at "den første lytterens" tilbakeringing vil kjøre før den andre, og så videre.
Du kan endre denne oppførselen ved å bruke EventEmitter's prependListener metode. Denne metoden tar de samme parameterne som på metode. Forskjellen er at denne metoden reagerer på hendelsen først, uavhengig av når du registrerer den.
For eksempel:
myEmitter.on("TestEvent", () => {
console.log("TestEvent sendt!!!");
});myEmitter.prependListener("TestEvent", () => {
console.log("Utføres først")
})
// console.log (myEmitter.listeners("TestEvent"));
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);
Når kodeblokken ovenfor kjøres, logges "Executes first" først til konsollen, etterfulgt av "TestEvent Emitted!!!" uavhengig av rekkefølgen du registrerte dem i på grunn av prependListener metode.
Hvis du registrerer flere lyttere med prependListener metoden, vil de kjøre i rekkefølge fra den siste til den første.
Legg merke til arrangementet til senderen og lytterne. Lytterne kommer alltid foran senderen. Denne ordningen er fordi lytterne allerede må lytte etter hendelsen før senderen sender den ut.
For kontekst, vurder kodeblokken nedenfor:
myEmitter.emit("TestEvent", "foo", "bar", 1, 2);
myEmitter.on("TestEvent", () => {
console.log("TestEvent sendt!!!");
});
Hvis du kjører kodeblokken ovenfor, skjer ingenting fordi på det tidspunktet senderen sendte ut hendelsen, var det ingen lyttere som lyttet etter hendelsen.
Lytter etter hendelser én gang
Avhengig av kravene dine, må du kanskje håndtere enkelte hendelser bare én gang i programmets livssyklus. Du kan oppnå dette ved å bruke EventEmitter's en gang metode.
Denne metoden tar de samme argumentene som på metode og fungerer på samme måte. Den eneste forskjellen er at lytterne registrerte seg hos en gang metode bare lytt etter hendelsen én gang.
For eksempel:
myEmitter.once("SingleEvent", () => {
console.log("Hendelse behandlet én gang");
});
myEmitter.emit("SingleEvent"); // Hendelse behandlet én gang
myEmitter.emit("SingleEvent"); // Ignorert
myEmitter.emit("SingleEvent"); // Ignorert
Kjøring av kodeblokken vil bare logge "Hendelse behandlet én gang" til konsollen én gang, uavhengig av hvor ofte senderen sender ut hendelsen.
Lyttere registrert hos en gang metoden reagerer på hendelsen i den rekkefølgen du registrerer dem. Du kan endre denne oppførselen ved å bruke prependOnceListener metode, som fungerer som prependListener. Den eneste forskjellen er at lytterne registrerte seg hos en gang metode bare lytt etter hendelsen én gang.
Håndtering av feil med hendelsessendere
Du bør passe på håndtere JavaScript-feil på riktig måte og arrangementslyttere er intet unntak. Ubehandlede feil fra dem vil føre til at Node.js-prosessen avsluttes og applikasjonen din krasjer.
For å håndtere en feilhendelse, må minst én av hendelsens lyttere ha sin Arrangementsnavn satt til feil.
For eksempel:
myEmitter.on("feil", (feil) => {
konsoll.feil(`Feil: ${error}`);
});
Å la en lytter håndtere en potensiell feil, som i kodeblokken ovenfor, vil stoppe applikasjonen fra å krasjer når en feil oppstår.
For eksempel:
myEmitter.emit("feil", ny feil("Dette er en feil"));
Å kjøre kodeblokken ovenfor vil logge "Dette er en feil" til konsollen fordi en lytter håndterer feilhendelser.
Administrere hendelseslyttere
De EventEmitter klasse har flere metoder som lar deg manipulere og administrere hendelseslyttere. Du kan hente lytterne til et arrangement, fjerne dem og angi maksimalt antall lyttere for et arrangement.
Her er en tabell som inneholder EventEmitter metoder du kan manipulere hendelseslyttere med:
Metode | Argumenter | Returverdi |
---|---|---|
listenerCount | arrangementsnavn | Returnerer antall lyttere som abonnerer på et arrangement |
lyttere | arrangementsnavn | Returnerer en rekke lyttere |
fjerneListener | arrangementsnavn | Fjerner minst én lytter fra et spesifisert eventName. |
fjern AlleListenere | arrangementsnavn | Fjerner alle lyttere for et spesifisert eventName. Hvis du ikke angir et hendelsesnavn, vil denne metodekallingen fjerne alle lyttere for EventEmitter. |
setMaxListeners | Antall | Endrer standard maks antall lyttere per hendelse. Bruk uendelig eller null for å indikere et ubegrenset antall lyttere. Som standard kan du bare abonnere på ti lyttere på et arrangement. |
Du kan bare kalle disse metodene på en EventEmitter forekomst.
For eksempel:
myEmitter.removeListener("TestEvent");
Kodeblokken ovenfor fjerner en enkelt lytter for TestEvent begivenhet.
Viktigheten av hendelsesmittere
Node.js tar i bruk det hendelsesdrevne programmeringsparadigmet med støtte for hendelsessendere og lyttere. Hendelsesdrevet programmering er en av grunnene til at Node.js-programmer er raskere og mer enkle enn noen alternativer. Du kan enkelt synkronisere flere hendelser, noe som resulterer i forbedret effektivitet.