Nodes kraftfulla händelsedrivna arkitektur är en av dess starkaste fördelar.
Viktiga takeaways
- Händelsedriven programmering är ett bra val för interaktiva appar, särskilt GUI-appar, eftersom det låter koden svara på användaråtgärder i valfri ordning.
- Händelsedriven programmering används ofta i webbappar, där händelseavlyssnare utlöses när användare interagerar med DOM.
- Att implementera händelsedriven programmering i Node.js är enkelt med EventEmitter-klassen, som låter dig skapa anpassade händelser och koppla händelseavlyssnare för att hantera dem.
När du bygger en mjukvaruapplikation är ett avgörande beslut att välja rätt paradigm för din kod.
Händelsedriven programmering är ett bra val för interaktiva appar som svarar på användaråtgärder som kan inträffa i valfri ordning. Det är ett mer populärt paradigm med GUI-appar än med kommandoradsprogram eller inbyggd systemkod.
Vad är händelser?
Du kan tänka på en händelse som en åtgärd eller händelse som din kod kan känna igen och svara på. Systemet eller en användare kan utlösa en händelse och din kod registrerar vanligtvis en funktion för att hantera den.
Ett exempel på en grundläggande händelse är att klicka på en knapp för att utföra en viss åtgärd. Handlingen att klicka på knappen utlöser en händelse, och funktionen som körs när klicket inträffar kallas för evenemangslyssnare (eller hanterare).
Vad är händelsestyrd programmering?
Händelsestyrd programmering är en programmeringsparadigm där ett programs exekveringsflöde beror på händelser som inträffar snarare än att vara strikt sekventiellt.
Detta paradigm används mest när man bygger användargränssnitt och realtidsapplikationer, där en händelse som en användares åtgärd ska utlösa en åtgärd i systemet.
Paradigmet är mycket populärt när man bygger webbappar, där händelseavlyssnare triggar när användare interagerar med Document Object Model (DOM).
Följande bild visualiserar hur flödet fungerar i händelsestyrd programmering. När en händelse inträffar tar händelsekanalen emot den och skickar den vidare till lämplig lyssnare att hantera:
Händelsedriven programmering i Node.js
De JavaScript-händelseloop är ett av de grundläggande koncepten bakom den asynkrona karaktären hos Node.js-körtiden. En händelsestyrd arkitektur använder sin inbyggda EventEmitter modul för att underlätta ett smidigt utförandeflöde.
Med händelsestyrd programmering låter Node.js dig skapa applikationer på serversidan som kan hantera användarinteraktion, I/O-operationer och databehandling i realtid. Detta sker på ett icke-blockerande sätt, vilket resulterar i förbättrad prestanda och en smidigare upplevelse för användaren.
Att implementera händelsedriven programmering i Node.js är enkelt när du förstår grunderna för att definiera, utlösa och hantera händelser.
EventEmitter-klassen
Med EventEmitter klass i Node.js kan du skapa anpassade händelser och bifoga händelseavlyssnare för att hantera dem. För att använda klassen i din kod, importera den från evenemang modul så här:
// CommonJS
const { EventEmitter } = require("events")
// ES6
import { EventEmitter } from"events"
Klassen och dess medlemsfunktioner är sedan tillgängliga för dig att använda i din applikation. För att börja sända och hantera händelser, initiera en ny instans av EventEmitter klass.
Till exempel:
const FoodEvents = new EventEmitter()
Detta skapar ett nytt sändarobjekt som kallas FoodEvents som kan sända ut händelser och registrera lyssnare. EventEmmitter-klassen tillhandahåller tre metoder för att lyssna på en händelse: på, addListener, och en gång.
De på metod är den mest grundläggande funktionen för att lägga till händelseavlyssnare, och addListener fungerar på exakt samma sätt. De accepterar båda händelsenamnet och en återuppringningsfunktion som argument. Återuppringningen är den faktiska hanterarfunktionen. Du kan använda på och addListener omväxlande.
Så här hanterar du en händelse med hjälp av på metod:
FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})
Använder sig av addListener som ett direkt alternativ för på:
FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})
Båda dessa exempel kommer att lägga till återuppringningen till arrayen av händelselyssnare för cookie_ready händelse. Om du använder båda kommer deras återuppringningar att aktiveras i ordning.
De en gång metoden registrerar en engångshändelselyssnare som körs nästa gång händelsen utlöses. Efter det kommer systemet att ta bort det från arrayen av lyssnare.
Så här använder du en gång för att hantera en engångshändelse:
FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})
I det här fallet kommer sändaren bara att lyssna efter cookie_sent händelse en gång och ta bort hanteraren efter att den har körts.
Alla tre metoderna returnerar sändaren, så att du kan koppla anrop till vilken som helst av dem.
Glöm inte att för att en lyssnare ska kunna hantera en händelse måste applikationen sända ut den händelsen någon gång. Här är några exempelkoder att sända ut cookie_ready händelse med hjälp av avge metod:
functionbakeCookie() {
console.log("Cookie is baking, almost ready...")setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}
bakeCookie()
När du kör den här koden som skriver ut ett meddelande i konsolen om att kakan bakas, väntar i 3 sekunder och avger cookie_ready händelse kommer du att få en utdata som bilden nedan:
Detta visar hur evenemangslyssnarna kör i den ordning du registrerar dem.
De EventEmitter klass ger fler metoder, inklusive:
- ta bortListener: Tar bort en instans av en lyssnare från arrayen av händelseavlyssnare. De av Metoden är också tillgänglig för detta ändamål.
- prependListener: Den här metoden registrerar också en lyssnare, men istället för att lägga till den i slutet av lyssnarmatrisen lägger den till den i början. Den körs sedan före alla andra lyssnare som du kanske redan har registrerat.
- prependOnceListener: Detta fungerar precis som prependListener, men lyssnaren körs bara en gång, som i fallet med en gång.
- ta bortAllListeners: Denna funktion tar bort alla registrerade lyssnare för en specifik namngiven händelse, eller alla lyssnare om du inte skickar något argument till den.
- lyssnare: Returnerar en uppsättning lyssnare med händelsenamnet du skickar till den som ett argument.
- händelsenamn: Du kan använda den här funktionen för att få alla händelsenamn som du redan har registrerat en lyssnare för.
- setMaxListeners: Node.js skickar en varning som standard när du registrerar fler än 10 lyssnare för en händelse, för att förhindra minnesläckor. Du kan justera detta standardvärde med setMaxListeners. Du kan också kontrollera detta värde med getMaxListeners.
De evenemang paketet ger omfattande funktionalitet för händelsedriven programmering i Node.js.
Vilka är några bästa praxis för händelsestyrd programmering?
Varje programmeringsmetod har sina kompromisser, och att ignorera bästa praxis kan få negativa effekter på din applikation. Följande är några bästa praxis att tänka på när du bygger händelsedrivna applikationer:
- Använd kortfattade och beskrivande namn för händelser för att möjliggöra en ren och underhållbar kodbas.
- Använd goda metoder för felhantering och loggning för att möjliggöra enkel felsökning av fel.
- Undvik callback helvetet (kapsla flera callbacks) när du skriver händelselyssnare. Använd JavaScript-löften istället.
- Skapa inte för många lyssnare för en händelse. Överväg att dela upp händelserna och kedja dem istället.
Bygg applikationer med rätt arkitektur
En allmän regel som gäller för byggprogramvara är att fatta lämpliga arkitektur- och designbeslut. När du följer fel tillvägagångssätt för att bygga en applikation kommer du att möta konsekvenserna så småningom.
Händelsedriven programmering är ett paradigm som kan ha en betydande inverkan på en applikations arkitektur och prestanda. Närhelst din applikation, eller en del av den, är beroende av händelser för att fungera, bör du överväga händelsestyrd programmering.