Nodes kraftfulde begivenhedsdrevne arkitektur er en af dens stærkeste fordele.
Nøgle takeaways
- Hændelsesdrevet programmering er et godt valg til interaktive apps, især GUI-apps, da det tillader koden at reagere på brugerhandlinger i enhver rækkefølge.
- Hændelsesdrevet programmering bruges almindeligvis i webapps, hvor hændelseslyttere udløses, når brugere interagerer med DOM.
- Implementering af begivenhedsdrevet programmering i Node.js er let med EventEmitter-klassen, som giver dig mulighed for at oprette tilpassede begivenheder og vedhæfte begivenhedslyttere til at håndtere dem.
Når du bygger en softwareapplikation, involverer en afgørende beslutning at vælge det passende paradigme for din kode.
Hændelsesdrevet programmering er et godt valg for interaktive apps, der reagerer på brugerhandlinger, som kan forekomme i en hvilken som helst rækkefølge. Det er et mere populært paradigme med GUI-apps end med kommandolinjeprogrammer eller indlejret systemkode.
Hvad er begivenheder?
Du kan tænke på en hændelse som en handling eller hændelse, som din kode kan genkende og reagere på. Systemet eller en bruger kan udløse en hændelse, og din kode vil normalt registrere en funktion til at håndtere den.
Et eksempel på en grundlæggende hændelse er at klikke på en knap for at udføre en bestemt handling. Handlingen med at klikke på knappen udløser en hændelse, og den funktion, der kører, når klikket sker, kaldes begivenheds lytter (eller handler).
Hvad er begivenhedsdrevet programmering?
Event-drevet programmering er en programmeringsparadigme hvor en applikations eksekveringsflow afhænger af hændelser, der opstår i stedet for at være strengt sekventielle.
Dette paradigme bruges mest ved opbygning af brugergrænseflader og realtidsapplikationer, hvor en hændelse som en brugers handling skal udløse en handling i systemet.
Paradigmet er meget populært, når man bygger webapps, hvor begivenhedslyttere trigger, når brugere interagerer med Document Object Model (DOM).
Følgende billede visualiserer, hvordan flowet fungerer i begivenhedsdrevet programmering. Når en begivenhed indtræffer, modtager begivenhedskanalen den og sender den videre til den relevante lytter, der skal håndtere:
Hændelsesdrevet programmering i Node.js
Det JavaScript hændelsesløkke er et af de grundlæggende begreber bag den asynkrone karakter af Node.js runtime. En begivenhedsdrevet arkitektur bruger sin indbyggede EventEmitter modul for at lette sømløst udførelsesflow.
Med hændelsesdrevet programmering giver Node.js dig mulighed for at skabe server-side-applikationer, der kan håndtere brugerinteraktion, I/O-operationer og databehandling i realtid. Dette sker på en ikke-blokerende måde, hvilket resulterer i forbedret ydeevne og en mere jævn oplevelse for brugeren.
Implementering af hændelsesdrevet programmering i Node.js er let, når du forstår det grundlæggende i at definere, udløse og håndtere hændelser.
EventEmitter-klassen
Med EventEmitter klasse i Node.js, kan du oprette brugerdefinerede begivenheder og vedhæfte begivenhedslyttere til at håndtere dem. For at bruge klassen i din kode skal du importere den fra begivenheder modul som dette:
// CommonJS
const { EventEmitter } = require("events")
// ES6
import { EventEmitter } from"events"
Klassen og dens medlemsfunktioner er så tilgængelige for dig at bruge i din applikation. For at begynde at udsende og håndtere hændelser skal du initialisere en ny forekomst af EventEmitter klasse.
For eksempel:
const FoodEvents = new EventEmitter()
Dette skaber et nyt emitterobjekt kaldet FoodEvents der kan udsende begivenheder og registrere lyttere. EventEmmitter-klassen giver tre metoder til at lytte til en begivenhed: på, addListener, og enkelt gang.
Det på metode er den mest basale funktion til tilføjelse af begivenhedslyttere, og addListener fungerer på nøjagtig samme måde. De accepterer begge hændelsesnavnet og en tilbagekaldsfunktion som argumenter. Tilbagekaldet er selve handlerfunktionen. Du kan bruge på og addListener omskifteligt.
Her er, hvordan du håndterer en begivenhed ved hjælp af på metode:
FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})
Ved brug af addListener som et direkte alternativ til på:
FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})
Begge disse eksempler vil tilføje tilbagekaldet til rækken af begivenhedslyttere for cookie_ready begivenhed. Hvis du bruger begge, vil deres tilbagekald udløses i rækkefølge.
Det enkelt gang metoden registrerer en engangshændelseslytter, som kører næste gang hændelsen udløses. Derefter vil systemet fjerne det fra rækken af lyttere.
Sådan bruger du enkelt gang for at håndtere en engangsbegivenhed:
FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})
I dette tilfælde vil udsenderen kun lytte efter cookie_sent hændelse én gang og fjern handleren efter den er kørt.
Alle tre metoder returnerer senderen, så du kan kæde opkald til enhver af dem.
Glem ikke, at for at en lytter skal kunne håndtere en begivenhed, skal applikationen udsende denne begivenhed på et tidspunkt. Her er en prøvekode til at udsende cookie_ready begivenhed ved hjælp af udsende metode:
functionbakeCookie() {
console.log("Cookie is baking, almost ready...")setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}
bakeCookie()
Når du kører denne kode, som udskriver en meddelelse i konsollen om, at cookien er ved at bage, venter i 3 sekunder og udsender cookie_ready begivenhed, vil du få et output som billedet nedenfor:
Dette viser, hvordan begivenhedslytterne kører i den rækkefølge, du registrerer dem.
Det EventEmitter klasse giver flere metoder, herunder:
- fjerneListener: Fjerner en forekomst af en lytter fra rækken af begivenhedslyttere. Det af metode er også tilgængelig til dette formål.
- prependListener: Denne metode registrerer også en lytter, men i stedet for at tilføje den til slutningen af lytter-arrayet, tilføjer den den til begyndelsen. Det vil derefter køre før andre lyttere, du måske allerede har registreret.
- prependOnceListener: Dette fungerer ligesom prependListener, men lytteren kører kun én gang, som i tilfældet med enkelt gang.
- fjern AlleLyttere: Denne funktion fjerner alle de registrerede lyttere for en bestemt navngivet begivenhed, eller alle lyttere, hvis du ikke sender noget argument til den.
- lyttere: Returnerer en række lyttere med det begivenhedsnavn, du sender til det som et argument.
- begivenhedsnavne: Du kan bruge denne funktion til at få alle de begivenhedsnavne, som du allerede har registreret en lytter til.
- setMaxListeners: Node.js kaster en advarsel som standard, når du registrerer mere end 10 lyttere til en begivenhed, for at forhindre hukommelseslækager. Du kan justere denne standardværdi ved hjælp af setMaxListeners. Du kan også kontrollere denne værdi vha getMaxListeners.
Det begivenheder pakken giver omfattende funktionalitet til hændelsesdrevet programmering i Node.js.
Hvad er nogle best practices for begivenhedsdrevet programmering?
Hver programmeringstilgang har sine afvejninger, og ignorering af bedste praksis kan have negative virkninger på din applikation. Følgende er nogle bedste praksisser at overveje, når du bygger begivenhedsdrevne applikationer:
- Brug kortfattede og beskrivende navne til begivenheder for at muliggøre en ren og vedligeholdelsesfri kodebase.
- Vedtag god fejlhåndtering og logningspraksis for at tillade nem fejlretning af fejl.
- Undgå tilbagekaldshelvede (indlejring af flere tilbagekald), når du skriver begivenhedslyttere. Brug JavaScript-løfter i stedet.
- Opret ikke for mange lyttere til én begivenhed. Overvej at opdele begivenhederne og lænke dem i stedet.
Byg applikationer med den rigtige arkitektur
En generel regel, der gælder for byggesoftware, er at træffe passende arkitektur- og designbeslutninger. Når du følger den forkerte tilgang til at bygge en applikation, vil du i sidste ende stå over for konsekvenserne.
Hændelsesdrevet programmering er et paradigme, der kan have en betydelig indflydelse på en applikations arkitektur og ydeevne. Når din applikation, eller en del af den, afhænger af begivenheder for at fungere, bør du overveje begivenhedsdrevet programmering.