De krachtige, gebeurtenisgestuurde architectuur van Node is een van de sterkste voordelen ervan.

Belangrijkste leerpunten

  • Gebeurtenisgestuurd programmeren is een goede keuze voor interactieve apps, vooral GUI-apps, omdat de code hierdoor in willekeurige volgorde op gebruikersacties kan reageren.
  • Gebeurtenisgestuurd programmeren wordt vaak gebruikt in webapps, waarbij gebeurtenislisteners worden geactiveerd wanneer gebruikers interactie hebben met de DOM.
  • Het implementeren van gebeurtenisgestuurd programmeren in Node.js is eenvoudig met de EventEmitter-klasse, waarmee u aangepaste gebeurtenissen kunt maken en gebeurtenislisteners kunt koppelen om deze af te handelen.

Bij het bouwen van een softwareapplicatie is een cruciale beslissing het selecteren van het juiste paradigma voor uw code.

Gebeurtenisgestuurd programmeren is een goede keuze voor interactieve apps die reageren op gebruikersacties die in willekeurige volgorde kunnen plaatsvinden. Het is een populairder paradigma bij GUI-apps dan bij opdrachtregelprogramma's of ingebedde systeemcode.

Wat zijn evenementen?

U kunt een gebeurtenis beschouwen als een actie of gebeurtenis die uw code kan herkennen en waarop u kunt reageren. Het systeem of een gebruiker kan een gebeurtenis activeren en uw code registreert doorgaans een functie om deze af te handelen.

Een voorbeeld van een basisgebeurtenis is het klikken op een knop om een ​​bepaalde actie uit te voeren. De handeling van het klikken op de knop activeert een gebeurtenis, en de functie die wordt uitgevoerd wanneer de klik plaatsvindt, wordt de genoemd gebeurtenis luisteraar (of begeleider).

Wat is gebeurtenisgestuurd programmeren?

Gebeurtenisgestuurd programmeren is een programmeerparadigma waarin de uitvoeringsstroom van een applicatie afhangt van gebeurtenissen die plaatsvinden in plaats van strikt opeenvolgend te zijn.

Dit paradigma wordt meestal gebruikt bij het bouwen van gebruikersinterfaces en realtime applicaties, waarbij een gebeurtenis zoals de actie van een gebruiker een actie in het systeem zou moeten activeren.

Het paradigma is erg populair bij het bouwen van webapps, waarbij gebeurtenislisteners worden geactiveerd wanneer gebruikers ermee communiceren het Document Object Model (DOM).

De volgende afbeelding visualiseert hoe de stroom werkt bij gebeurtenisgestuurd programmeren. Wanneer er een gebeurtenis plaatsvindt, ontvangt het gebeurteniskanaal deze en geeft deze door aan de juiste luisteraar om het volgende af te handelen:

Gebeurtenisgestuurd programmeren in Node.js

De JavaScript-gebeurtenislus is een van de fundamentele concepten achter het asynchrone karakter van de Node.js-runtime. Een gebeurtenisgestuurde architectuur maakt gebruik van de ingebouwde GebeurtenisEmitter module om een ​​naadloze uitvoeringsstroom te vergemakkelijken.

Met gebeurtenisgestuurd programmeren kunt u met Node.js toepassingen op de server maken die gebruikersinteractie, I/O-bewerkingen en realtime gegevensverwerking aankunnen. Dit gebeurt op een niet-blokkerende manier, wat resulteert in verbeterde prestaties en een soepelere ervaring voor de gebruiker.

Het implementeren van gebeurtenisgestuurd programmeren in Node.js is eenvoudig als u de basisprincipes van het definiëren, activeren en afhandelen van gebeurtenissen begrijpt.

De EventEmitter-klasse

Met de GebeurtenisEmitter class in Node.js kunt u aangepaste gebeurtenissen maken en gebeurtenislisteners koppelen om deze af te handelen. Om de klasse in uw code te gebruiken, importeert u deze uit de evenementen module zoals deze:

// CommonJS
const { EventEmitter } = require("events")

// ES6
import { EventEmitter } from"events"

De klasse en de lidfuncties ervan kunt u vervolgens in uw toepassing gebruiken. Om te beginnen met het uitzenden en afhandelen van gebeurtenissen, initialiseert u een nieuw exemplaar van de GebeurtenisEmitter klas.

Bijvoorbeeld:

const FoodEvents = new EventEmitter()

Hierdoor wordt een nieuw emitterobject gemaakt, genaamd VoedselEvenementen die gebeurtenissen kunnen uitzenden en luisteraars kunnen registreren. De klasse EventEmmitter biedt drie methoden voor het luisteren naar een gebeurtenis: op, toevoegenLuister, En eenmaal.

De op methode is de meest elementaire functie voor het toevoegen van gebeurtenislisteners, en addListener werkt op precies dezelfde manier. Ze accepteren allebei de gebeurtenisnaam en een callback-functie als argumenten. De callback is de daadwerkelijke handlerfunctie. Je kunt gebruiken op En addListener uitwisselbaar.

Hier ziet u hoe u een gebeurtenis afhandelt met behulp van de op methode:

FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})

Gebruik makend van addListener als direct alternatief voor op:

FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})

In beide voorbeelden wordt de callback toegevoegd aan de array met gebeurtenislisteners voor de koekje_klaar evenement. Als je beide gebruikt, worden hun callbacks op volgorde geactiveerd.

De eenmaal methode registreert een eenmalige gebeurtenislistener die wordt uitgevoerd de volgende keer dat de gebeurtenis wordt geactiveerd. Daarna verwijdert het systeem het uit de reeks luisteraars.

Hier ziet u hoe u het kunt gebruiken eenmaal een eenmalige gebeurtenis afhandelen:

FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})

In dit geval luistert de zender alleen naar de cookie_verzonden gebeurtenis één keer en verwijder de handler nadat deze is uitgevoerd.

Alle drie de methoden retourneren de zender, zodat u oproepen naar een van deze methoden kunt koppelen.

Vergeet niet dat als een luisteraar een gebeurtenis wil afhandelen, de toepassing die gebeurtenis op een gegeven moment moet uitzenden. Hier is een voorbeeldcode om het koekje_klaar evenement met behulp van de uitstoten methode:

functionbakeCookie() {
console.log("Cookie is baking, almost ready...")

setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}

bakeCookie()

Wanneer u deze code uitvoert, wordt er in de console een bericht afgedrukt dat de cookie aan het bakken is, wacht deze 3 seconden en verzendt de koekje_klaar gebeurtenis, krijgt u een uitvoer zoals in de onderstaande afbeelding:

Dit laat zien hoe de gebeurtenislisteners worden uitgevoerd in de volgorde waarin u ze registreert.

De GebeurtenisEmitter klasse biedt meer methoden, waaronder:

  • verwijderListener: Verwijdert een exemplaar van een luisteraar uit de reeks gebeurtenislisteners. De uit Hiervoor is ook een methode beschikbaar.
  • prependListener: Deze methode registreert ook een luisteraar, maar in plaats van deze toe te voegen aan het einde van de array van luisteraars, wordt deze aan het begin toegevoegd. Het wordt dan uitgevoerd vóór andere luisteraars die u mogelijk al hebt geregistreerd.
  • prependOnceListener: Dit werkt net als prependListener, maar de luisteraar wordt slechts één keer uitgevoerd, zoals in het geval van eenmaal.
  • verwijderAllListeners: Deze functie verwijdert alle geregistreerde luisteraars voor een specifiek benoemde gebeurtenis, of alle luisteraars als u er geen argument aan doorgeeft.
  • luisteraars: Retourneert een array met luisteraars van de gebeurtenisnaam die u eraan doorgeeft als argument.
  • gebeurtenisNamen: U kunt deze functie gebruiken om alle gebeurtenisnamen op te halen waarvoor u al een luisteraar hebt geregistreerd.
  • setMaxListeners: Node.js genereert standaard een waarschuwing wanneer u meer dan 10 luisteraars voor een gebeurtenis registreert, om geheugenlekken te voorkomen. U kunt deze standaardwaarde aanpassen met setMaxListeners. U kunt deze waarde ook controleren met getMaxListeners.

De evenementen pakket biedt uitgebreide functionaliteit voor gebeurtenisgestuurd programmeren in Node.js.

Wat zijn enkele best practices voor gebeurtenisgestuurd programmeren?

Elke programmeeraanpak heeft zijn nadelen, en het negeren van best practices kan nadelige gevolgen hebben voor uw toepassing. Hier volgen enkele best practices waarmee u rekening moet houden bij het bouwen van gebeurtenisgestuurde toepassingen:

  • Gebruik beknopte en beschrijvende namen voor gebeurtenissen om een ​​schone en onderhoudbare codebasis mogelijk te maken.
  • Hanteer goede foutafhandelings- en logboekpraktijken, zodat fouten eenvoudig kunnen worden opgespoord.
  • Vermijd de callback-hel (het nestelen van meerdere callbacks) bij het schrijven van gebeurtenislisteners. Gebruik in plaats daarvan JavaScript-beloften.
  • Creëer niet te veel luisteraars voor één evenement. Overweeg om de gebeurtenissen op te splitsen en in plaats daarvan aan elkaar te koppelen.

Bouw applicaties met de juiste architectuur

Een algemene regel die van toepassing is op het bouwen van software is het nemen van passende architectuur- en ontwerpbeslissingen. Wanneer u de verkeerde aanpak volgt bij het bouwen van een applicatie, zult u uiteindelijk met de gevolgen te maken krijgen.

Gebeurtenisgestuurd programmeren is een paradigma dat een aanzienlijke impact kan hebben op de architectuur en prestaties van een applicatie. Wanneer uw applicatie, of een deel ervan, afhankelijk is van gebeurtenissen om te kunnen functioneren, kunt u gebeurtenisgestuurd programmeren overwegen.