Nodes kraftige hendelsesdrevne arkitektur er en av dens sterkeste fordeler.
Viktige takeaways
- Hendelsesdrevet programmering er et godt valg for interaktive apper, spesielt GUI-apper, siden den lar koden svare på brukerhandlinger i hvilken som helst rekkefølge.
- Hendelsesdrevet programmering brukes ofte i nettapper, der hendelseslyttere utløses når brukere samhandler med DOM.
- Implementering av hendelsesdrevet programmering i Node.js er enkelt med EventEmitter-klassen, som lar deg lage tilpassede hendelser og knytte til hendelseslyttere for å håndtere dem.
Når du bygger en hvilken som helst programvareapplikasjon, er en avgjørende beslutning å velge det riktige paradigmet for koden din.
Hendelsesdrevet programmering er et godt valg for interaktive apper som reagerer på brukerhandlinger som kan forekomme i hvilken som helst rekkefølge. Det er et mer populært paradigme med GUI-apper enn med kommandolinjeprogrammer eller innebygd systemkode.
Hva er hendelser?
Du kan tenke på en hendelse som en handling eller hendelse som koden din kan gjenkjenne og svare på. Systemet eller en bruker kan utløse en hendelse og koden din vil vanligvis registrere en funksjon for å håndtere den.
Et eksempel på en grunnleggende hendelse er å klikke på en knapp for å utføre en bestemt handling. Å klikke på knappen utløser en hendelse, og funksjonen som kjører når klikket skjer kalles begivenhetslytter (eller handler).
Hva er hendelsesdrevet programmering?
Hendelsesdrevet programmering er en programmeringsparadigme der en applikasjons utførelsesflyt avhenger av hendelser som oppstår i stedet for å være strengt sekvensielle.
Dette paradigmet brukes mest når man bygger brukergrensesnitt og sanntidsapplikasjoner, der en hendelse som en brukers handling skal utløse en handling i systemet.
Paradigmet er veldig populært når man bygger nettapper, der hendelseslyttere utløses når brukere samhandler med dokumentobjektmodellen (DOM).
Følgende bilde visualiserer hvordan flyten fungerer i hendelsesdrevet programmering. Når en hendelse inntreffer, mottar hendelseskanalen den og sender den videre til den aktuelle lytteren for å håndtere:
Hendelsesdrevet programmering i Node.js
De JavaScript-hendelsesløkke er et av de grunnleggende konseptene bak den asynkrone naturen til Node.js-kjøringen. En hendelsesdrevet arkitektur bruker sin innebygde EventEmitter modul for å lette sømløs utførelsesflyt.
Med hendelsesdrevet programmering lar Node.js deg lage serversideapplikasjoner som kan håndtere brukerinteraksjon, I/O-operasjoner og sanntidsdatabehandling. Dette skjer på en ikke-blokkerende måte, noe som resulterer i forbedret ytelse og en jevnere opplevelse for brukeren.
Implementering av hendelsesdrevet programmering i Node.js er enkelt når du forstår det grunnleggende om å definere, utløse og håndtere hendelser.
EventEmitter-klassen
Med EventEmitter klasse i Node.js, kan du opprette egendefinerte hendelser og legge ved hendelseslyttere for å håndtere dem. For å bruke klassen i koden din, importer den fra arrangementer modul som dette:
// CommonJS
const { EventEmitter } = require("events")
// ES6
import { EventEmitter } from"events"
Klassen og dens medlemsfunksjoner er da tilgjengelige for deg å bruke i applikasjonen din. For å begynne å sende ut og håndtere hendelser, initialiser en ny forekomst av EventEmitter klasse.
For eksempel:
const FoodEvents = new EventEmitter()
Dette oppretter et nytt emitterobjekt kalt FoodEvents som kan sende ut hendelser og registrere lyttere. EventEmmitter-klassen gir tre metoder for å lytte til en hendelse: på, addListener, og en gang.
De på metoden er den mest grunnleggende funksjonen for å legge til hendelseslyttere, og addListener fungerer på nøyaktig samme måte. De godtar begge hendelsesnavnet og en tilbakeringingsfunksjon som argumenter. Tilbakeringingen er selve behandlerfunksjonen. Du kan bruke på og addListener om hverandre.
Slik håndterer du et arrangement ved å bruke på metode:
FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})
Ved hjelp av addListener som et direkte alternativ for på:
FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})
Begge disse eksemplene vil legge tilbakeringingen til utvalget av hendelseslyttere for cookie_ready begivenhet. Hvis du bruker begge, vil tilbakeringingene deres utløses i rekkefølge.
De en gang metoden registrerer en engangshendelseslytter som kjører neste gang hendelsen utløses. Etter det vil systemet fjerne det fra utvalget av lyttere.
Slik bruker du en gang for å håndtere en engangshendelse:
FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})
I dette tilfellet vil senderen bare lytte etter cookie_sent hendelsen én gang og fjern behandleren etter at den har kjørt.
Alle tre metodene returnerer senderen, slik at du kan lenke anrop til en av dem.
Ikke glem at for at en lytter skal håndtere en hendelse, må applikasjonen sende ut den hendelsen på et tidspunkt. Her er noen eksempelkode for å sende ut cookie_ready hendelse ved hjelp av avgir metode:
functionbakeCookie() {
console.log("Cookie is baking, almost ready...")setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}
bakeCookie()
Når du kjører denne koden som skriver ut en melding i konsollen om at informasjonskapselen bakes, venter i 3 sekunder og sender ut cookie_ready begivenhet, vil du få en utgang som bildet nedenfor:
Dette viser hvordan arrangementslyttere kjører i den rekkefølgen du registrerer dem.
De EventEmitter klasse gir flere metoder, inkludert:
- fjernListener: Fjerner en forekomst av en lytter fra utvalget av hendelseslyttere. De av metoden er også tilgjengelig for dette formålet.
- prependListener: Denne metoden registrerer også en lytter, men i stedet for å legge den til på slutten av lyttergruppen, legger den den til i begynnelsen. Den vil da kjøre før andre lyttere du kanskje allerede har registrert.
- prependOnceListener: Dette fungerer akkurat som prependListener, men lytteren kjører bare én gang, som i tilfellet med en gang.
- fjern AlleListenere: Denne funksjonen fjerner alle registrerte lyttere for en bestemt navngitt hendelse, eller alle lyttere hvis du ikke sender noen argumenter til den.
- lyttere: Returnerer en rekke lyttere med hendelsesnavnet du sender til det som et argument.
- hendelsesnavn: Du kan bruke denne funksjonen til å få alle hendelsesnavnene du allerede har registrert en lytter for.
- setMaxListeners: Node.js sender en advarsel som standard når du registrerer mer enn 10 lyttere for en hendelse, for å forhindre minnelekkasjer. Du kan justere denne standardverdien ved å bruke setMaxListeners. Du kan også sjekke denne verdien ved å bruke getMaxListeners.
De arrangementer pakken gir omfattende funksjonalitet for hendelsesdrevet programmering i Node.js.
Hva er noen beste praksiser for hendelsesdrevet programmering?
Hver programmeringstilnærming har sine avveininger, og å ignorere beste praksis kan ha negative effekter på applikasjonen din. Følgende er noen beste fremgangsmåter du bør vurdere når du bygger hendelsesdrevne applikasjoner:
- Bruk kortfattede og beskrivende navn for hendelser for å muliggjøre en ren og vedlikeholdbar kodebase.
- Vedta god feilhåndtering og loggingspraksis, for å tillate enkel feilsøking.
- Unngå tilbakeringingshelvete (hemming av flere tilbakeringinger) når du skriver hendelseslyttere. Bruk JavaScript-løfter i stedet.
- Ikke opprett for mange lyttere for en hendelse. Vurder å dele opp hendelsene og lenke dem i stedet.
Bygg applikasjoner med riktig arkitektur
En generell regel som gjelder for byggeprogramvare er å ta passende arkitektur- og designbeslutninger. Når du følger feil tilnærming til å bygge en applikasjon, vil du møte konsekvensene til slutt.
Hendelsesdrevet programmering er et paradigme som kan ha en betydelig innvirkning på en applikasjons arkitektur og ytelse. Når applikasjonen din, eller en del av den, er avhengig av at hendelser skal fungere, bør du vurdere hendelsesdrevet programmering.