Hændelseshåndtering i Node.js

I Node.js mange af de objekter, der findes i miljøet, udsender begivenheder, for eksempel udsender en TCP -server en begivenhed af typen Opret forbindelse hver gang en ny klient opretter forbindelse eller en strøm af filer udsender oplysninger hver gang et stykke information læses.

Dette i Node.js er det, der kaldes begivenhedsudsendere, som giver udviklere mulighed for at abonnere på begivenheder, hvor det abonnerer på en funktion ring tilbage som vil blive påberåbt hver gang en begivenhed i hændelsesemitteren forekommer. Vi kan endda oprette vores egne begivenhedsudsendere takket være pseudoklassen EventEmitter.

For at komme ind med begivenhedsudsendere skal vi dog først være klare om nogle begreber, såsom nogle mønstre af disse funktioner, begivenhedstyperne og endda lytterne.

KravFor at udføre de øvelser, der foreslås i denne vejledning, skal vi have en funktionel installation af Node.js i vores system, kan vi tage et kig på denne vejledning, før vi fortsætter med at dykke ned i den. Det er også vigtigt at have adgang til en rich text -editor til at kode eksemplerne, vi kan bruge alt, hvad vi føler os trygge ved, men for dets brugervenlighed anbefaler vi Sublim tekst o NotePad ++ som også har plugins til syntaksen JavaScript Y HTML.

Mønster til tilbagekald


Asynkron programmering bruger ikke returnering af værdier i funktionerne til at angive, at denne funktion netop er afsluttet, men den påberåber det berømte tilbagekald efter operationen er afsluttet, så vores program kan fortsætte, hvor JavaScript Jeg leder til denne type programmering, lad os se et eksempel i Giv ikke som læser en fil og indlæser dens indhold i hukommelsen:
 var fs = require ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('File content:', fileContent.toString ());});
Hvad vi gør her er, at vi sender en anonym funktion som funktionens andet argument fs.readFile, og hvordan kan vi se, at det første argument for tilbagekaldsfunktionen er et fejlobjekt, som vil have en forekomst af fejlklassen, hvis der opstår en fejl.

Mønster til arrangementets emitter


Den tidligere stil fungerer perfekt, når vi vil meddele, at en funktion, vi udfører, afslutter sit arbejde, men i tilfælde af at flere begivenheder finder sted under denne udførelse eller mange gange, fungerer denne stil ikke, som vi ønsker. For eksempel, hvis vi vil have besked hver gang oplysningerne er tilgængelige i stikkontakten, en funktion af typen ring tilbage standard vil ikke hjælpe os meget, men det er her begivenhedsudsenderen kan hjælpe os.

Begivenhedsudsenderen er ikke andet end et objekt, der, som navnet angiver, udsender en begivenhed, hvor a lytter det er en del af koden, der binder til denne sender og lytter til bestemte typer begivenheder, såsom:

 var req = http.request (muligheder, funktion (svar) {response.on ("data", funktion (data) {console.log ("Nogle svardata", data);}); response.on ("end" , function () {console.log ("udfyldt svar");});}); req.end ();
Dette er en rent forklarende kode, hvor vi kan se nogle af trinene til at fremsætte en anmodning HTTP til en fjernserver, men det giver os mulighed for at se, hvordan svarobjektet er en hændelsesudsender, som ikke kun kan udsende data Y ende men andre typer begivenheder.

Begivenhedstyper


Ifølge det foregående eksempel kunne vi se, at de udsendte hændelser altid har en type, der er repræsenteret med en streng, i dette tilfælde "data"Y"ende”, Som vil være vilkårlige strenge udpeget af hændelsesudstederen.

Eventemitteren er en generisk grænseflade, der betjener enhver form for begivenhed, men der er et særligt tilfælde i implementeringen af Giv ikke og det er begivenheden fejl, hvor hver hændelse i miljøet udsender en hændelse af denne type, hver gang der opstår en fejl, og hvis udvikleren vælger ikke at lytte til denne type hændelse, og der opstår en fejl, vil hændelsesemitteren bemærke det og frembringe en undtagelse i dette tilfælde . Lad os se i følgende kode, hvordan vi kan simulere denne adfærd:

 var em = new (require ('events'). EventEmitter) (); em.emit ('event1'); em.emit ('fejl', ny fejl ('min fejl'));
Hvis vi kører det gennem konsollen, kan vi se hvordan Giv ikke fortæller os, at vi ikke håndterer fejlen og genererer således en ufanget undtagelse:

Da vi har set, hvordan begivenheder opfører sig generelt, lad os se, hvordan vi bruger event -emitter -API'en.

Brug af event emitter API


Ethvert objekt, der implementerer hændelsesemittermønsteret, implementerer en række begivenheder, som vi kan se nedenfor:

.addListener - .onDenne metode giver os mulighed for at tilføje en lytter til en begivenhedstype.
.elleveMed denne metode kan vi binde en lytter til en begivenhedstype, da den vil blive kaldt mindst en gang.
.removeEventListenerDenne metode giver os mulighed for at fjerne en lytter fra enhver given begivenhed.
.removeAllEventListenersEndelig hjælper denne metode os med at fjerne alle lyttere til en given begivenhedstype.
Efter allerede at have set, hvad funktionen af ​​hver af disse er, lad os se, hvordan vi bruger dem inden for vores programmer.

Brug af .addListener () eller .on () i tilbagekald


Ved at angive en hændelsestype og en funktion ring tilbage, kan vi registrere den handling, der skal udføres, når en bestemt hændelse opstår. For eksempel, hvis vi vil blive informeret om, at en del af data er tilgængelige og udsende en hændelse med typedata, kan vi gøre følgende:
 funktion modtageData (data) {console.log ("Dataene blev indhentet:% j", data); } readFlow.addListener ("data", modtageData);
Vi kan også bruge metoden .på () som bare er en genvej, lad os se ækvivalent med den tidligere kode:
 funktion modtageData (data) {console.log ("Dataene blev indhentet:% j", data); } readFlow.on ("data", modtageData);
Vi kan endda tilføje flere lyttere til vores begivenheder for at lytte til den samme type begivenhed på den samme sender, for eksempel:

I dette eksempel er det, der gøres, at binde to funktioner til datatypehændelsen, og hvor en gang datahændelsen er udsendt, udskrives begge strenge. Det er vigtigt at bemærke, at eventudstederen er ansvarlig for at ringe til alle lyttere registreret for en begivenhedstype, og den kalder dem i den rækkefølge, de blev registreret, hvilket betyder følgende:

  • En lytter kan ikke kaldes umiddelbart efter, at begivenheden er udsendt, det er muligt, at andre lyttere bliver ringet op før.
  • Ikke at fange undtagelser er usund adfærd for vores kode, så hvis nogen af ​​disse lyttere kaster en fejl og ikke bliver fanget, er det muligt, at nogle lyttere ikke bliver kaldt, hvor vi kan illustrere dette i følgende eksempel:

Hvor i dette eksempel den anden lytter ikke vil blive påkaldt siden den første kastede en fejl.

Brug af .removeListener ()


Hvis vi på et hvilket som helst tidspunkt ikke længere ønsker at blive informeret om ændringer af en bestemt hændelse eller et bestemt objekt, kan vi stoppe optagelsen ved at angive hændelsestypen og tilbagekaldsfunktionen som følger:

Brug af .once ()


I tilfælde af at vores applikation lytter efter en begivenhed, der vil ske mindst en gang, eller hvis vi kun er interesseret i, at det kun sker én gang, kan vi bruge .elleve(), som tilføjer lytteren og fjerner den, når den første begivenhed indtræffer:

Brug af .removeAllListeners ()


Endelig kan vi fjerne alle lyttere til en bestemt begivenhedstype fra en begivenhedsudsender som følger:
 issuer.removeAllListeners (type);

Oprettelse af eventemitter


Begivenhedsudsenderen giver os en generisk måde at oprette grænseflader på, da vi binder begivenheder i stedet for funktioner, hvilket gør vores program mere fleksibelt, selvom vi ønsker at bruge mønsteret Node.js I hele vores ansøgning kan vi oprette en pseudoklasse og arve fra EventEmitter som følger:
 util = kræver ('util'); var EventEmitter = require ('events'). EventEmitter; var MyClass = function () {} util.inherits (MyClass, EventEmitter);
På denne måde metoder til EventEmitter De vil være tilgængelige for vores instans, og vi kan bruge dem uden problemer og på denne måde Min klasse kan udsende begivenheder:
 MyClass.prototype.someMethod = function () {this.emit ("tilpasset hændelse", "argument 1", "argument 2"); };
Her når en eller anden metode kaldes i tilfælde af Min klasse, eksemplet udsender en begivenhed kaldet tilpasset begivenhed, hvor den til gengæld udsender to forskellige data, argument 1 og argument 2, som sendes til begivenhedslytterne. Endelig i tilfælde af Min klasse på klientsiden kan du lytte til tilpasset begivenhed som følger:
 var MyClass = ny MyClass (); MyClass.on ('tilpasset hændelse', funktion (str1, str2) {console.log ('Brugerdefineret begivenhed lyttet med argumenter str1% s og str2% s!', Str1, str2);});
Som vi kan se, hjælper brugen af ​​begivenheder sammen med eventemitteren os med at kommunikere med vores applikation, og sådan sluttede vi denne vejledning, hvor vi kunne gå ud over asynkron programmering og anvende praksis, der hjælper os med at opretholde en standard og optimal mønster. til vores applikationer.

wave wave wave wave wave