Upravljanje događajima u Node.js

U Node.js mnogi objekti prisutni u okruženju emitiraju događaje, na primjer TCP poslužitelj emitira događaj tipa Spojiti svaki put kad se novi klijent poveže ili niz datoteka emitira informacije svaki put kad se neki podatak pročita.

Ovo u Node.js je ono što se naziva odašiljač događaja, koji programerima omogućuje mogućnost pretplate na događaje, gdje pretplaćuje funkciju uzvratiti poziv koji će se dozivati ​​svaki put kada se dogodi događaj u odašiljaču događaja. Čak možemo stvoriti vlastite emitere događaja zahvaljujući pseudo-klasi EventEmitter.

Međutim, da bismo ušli s odašiljačima događaja, prvo moramo biti jasni oko nekih pojmova, poput nekih obrazaca ovih funkcija, vrsta događaja, pa čak i slušatelja.

ZahtjeviZa izvođenje vježbi predloženih u ovom vodiču moramo imati funkcionalnu instalaciju Node.js u našem sustavu možemo pogledati ovaj vodič prije nego se nastavimo baviti njime. Također je važno imati pristup uređivaču obogaćenog teksta za kodiranje primjera, možemo koristiti sve što nam odgovara, međutim, zbog njegove jednostavnosti korištenja, preporučujemo Uzvišen tekst o NotePad ++ koji također ima dodatke za sintaksu JavaScript Y HTML.

Uzorak za povratne pozive


Asinkrono programiranje ne koristi vraćanje vrijednosti u funkcijama za označavanje da je ta funkcija upravo završila, već poziva poznati poziv nakon završetka operacije kako bi se naš program mogao nastaviti, gdje JavaScript Došao sam do ove vrste programiranja, pogledajmo primjer u Nemoj dati koji čita datoteku i učitava njezin sadržaj u memoriju:
 var fs = zahtijevaju ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {throw err;} console.log ('Sadržaj datoteke:', fileContent.toString ());});
Ono što ovdje radimo je da šaljemo anonimnu funkciju kao drugi argument funkcije fs.readFile, i kako možemo vidjeti da je prvi argument funkcije povratnog poziva objekt pogreške, koji će imati instancu klase Error ako dođe do pogreške.

Uzorak za odašiljač događaja


Prethodni stil savršeno funkcionira kada želimo obavijestiti da funkcija koju izvršavamo završava svoj rad, ali u slučaju da se tijekom ove izvedbe ili više puta dogodi više događaja, ovaj stil neće funkcionirati kako želimo. Na primjer, ako želimo biti obaviješteni svaki put kada su informacije dostupne u utičnici, funkcija tipa uzvratiti poziv standard nam neće puno pomoći, ali tu nam može pomoći emiter događaja.

Odašiljač događaja nije ništa drugo do objekt koji, kako mu naziv govori, emitira događaj, pri čemu je a slušatelj to je dio koda koji se veže za ovaj odašiljač i sluša određene vrste događaja, kao što su:

 var req = http.request (opcije, funkcija (odgovor) {response.on ("podaci", funkcija (podaci) {console.log ("Neki podaci o odgovoru", podaci);}); response.on ("kraj" , function () {console.log ("dovršen odgovor");});}); req.end ();
Ovo je čisto objašnjenje, gdje možemo vidjeti neke korake za podnošenje zahtjeva HTTP na udaljeni poslužitelj, ali nam omogućuje da vidimo kako je objekt odgovora odašiljač događaja, koji može emitirati ne samo podaci Y kraj ali i druge vrste događaja.

Vrste događaja


Prema prethodnom primjeru mogli smo vidjeti da emitirani događaji uvijek imaju vrstu, koja je predstavljena nizom, u ovom slučaju "podaci"Y"kraj”, Koji će biti proizvoljni nizovi koje je odredio izdavač događaja.

Odašiljač događaja generičko je sučelje koje opslužuje bilo koju vrstu događaja, ali postoji poseban slučaj u implementaciji Nemoj dati i to je događaj pogreška, gdje će svaki događaj u okruženju emitirati događaj ove vrste svaki put kada dođe do pogreške, a ako programer odluči ne slušati ovu vrstu događaja i dođe do pogreške, odašiljač događaja će to primijetiti i u ovom slučaju postaviti iznimku . Pogledajmo u sljedećem kodu kako možemo simulirati ovo ponašanje:

 var em = new (require ('events'). EventEmitter) (); em.emit ('događaj1'); em.emit ('error', new Error ('Moja pogreška'));
Ako ga pokrenemo kroz konzolu, možemo vidjeti kako Nemoj dati govori nam da ne rješavamo pogrešku, pa generiramo nehvaćenu iznimku:

Budući da smo vidjeli kako se događaji općenito ponašaju, pogledajmo kako koristimo API za odašiljač događaja.

Korištenje API -ja odašiljača događaja


Svaki objekt koji implementira uzorak odašiljača događaja implementira niz događaja kao što možemo vidjeti u nastavku:

.addListener - .naOva nam metoda omogućuje dodavanje slušatelja u vrstu događaja.
.jedanaestOvom metodom možemo vezati slušatelja za vrstu događaja s obzirom na to da će biti pozvan barem jednom.
.removeEventListenerOva će nam metoda omogućiti uklanjanje slušatelja iz bilo kojeg danog događaja.
.removeAllEventListenersKonačno, ova nam metoda pomaže ukloniti sve slušatelje za datu vrstu događaja.
Nakon što smo već vidjeli koja je funkcija svakog od njih, pogledajmo kako ih koristimo u našim programima.

Korištenje .addListener () ili .on () u povratnim pozivima


Određivanjem vrste događaja i funkcije uzvratiti poziv, možemo zabilježiti radnju koju treba poduzeti kada se dogodi određeni događaj. Na primjer, ako želimo biti obaviješteni da je dio podataka dostupan i emitirati događaj tipa podataka, možemo učiniti sljedeće:
 funkcija receiveData (data) {console.log ("Podaci su dobiveni:% j", podaci); } readFlow.addListener ("podaci", receiveData);
Također možemo koristiti metodu .on () što je samo prečica, pogledajmo ekvivalent prethodnog koda:
 funkcija receiveData (data) {console.log ("Podaci su dobiveni:% j", podaci); } readFlow.on ("data", receiveData);
Možemo čak dodati više slušatelja za naše događaje kako bi slušali istu vrstu događaja na istom odašiljaču, na primjer:

U ovom primjeru, ono što se radi veže dvije funkcije za događaj tipa podataka, a gdje će se, kad se podatkovni događaj emitira, ispisati oba niza. Važno je napomenuti da je izdavatelj događaja odgovoran za pozivanje svih slušatelji registrirani za vrstu događaja i nazvat će ih redoslijedom kojim su registrirani, što znači sljedeće:

  • Slušatelja se ne može nazvati odmah nakon što je događaj emitiran, moguće je da su drugi slušatelji pozvani prije.
  • Ne hvatanje iznimaka nezdravo je ponašanje za naš kôd, pa ako bilo koji od ovih slušatelja baci pogrešku i nije uhvaćen, moguće je da se neki slušatelji ne pozovu, što možemo ilustrirati u sljedećem primjeru:

Gdje se u ovom primjeru drugi slušatelj neće pozvati budući da je prvi napravio grešku.

Upotreba .removeListener ()


Ako u bilo kojem trenutku više ne želimo biti obaviješteni o promjenama određenog događaja ili objekta, možemo ga zaustaviti snimanjem tako što ćemo navesti vrstu događaja i funkciju povratnog poziva na sljedeći način:

Upotreba .once ()


U slučaju da naša aplikacija osluškuje događaj koji će se dogoditi barem jednom ili ako nas zanima samo da se to dogodi samo jednom, možemo koristiti .jedanaest(), koji dodaje slušatelja i uklanja ga nakon što se dogodi prvi događaj:

Upotreba .removeAllListeners ()


Konačno, možemo ukloniti sve slušatelje za određenu vrstu događaja iz emitera događaja na sljedeći način:
 izdavatelj.removeAllListeners (tip);

Stvaranje emitera događaja


Odašiljač događaja pruža nam generički način stvaranja sučelja, budući da vežemo događaje umjesto funkcija, čineći naš program fleksibilnijim, čak i ako želimo koristiti obrazac Node.js U cijeloj našoj aplikaciji možemo stvoriti pseudo-klasu i naslijediti iz EventEmitter kako slijedi:
 util = require ('util'); var EventEmitter = require ('events'). EventEmitter; var MyClass = function () {} util.inherits (MyClass, EventEmitter);
Na ovaj način metode EventEmitter Oni će biti dostupni za našu instancu i možemo ih koristiti bez problema i na ovaj način Moj razred mogu emitirati događaje:
 MyClass.prototype.someMethod = function () {this.emit ("prilagođeni događaj", "argument 1", "argument 2"); };
Ovdje kad neka metoda naziva se u slučaju Moj razred, primjer emitira događaj tzv prilagođeni događaj, pri čemu emitira dva različita podatka, argument 1 i argument 2, koji će biti poslani slušateljima događaja. Konačno u slučajevima Moj razred na strani klijenta možete slušati prilagođeni događaj kako slijedi:
 var MyClass = novi MyClass (); MyClass.on ('prilagođeni događaj', funkcija (str1, str2) {console.log ('Prilagođeni događaj preslušan s argumentima str1% s i str2% s!', Str1, str2);});
Kao što vidimo, upotreba događaja zajedno s odašiljačem događaja pomaže nam u komunikaciji s našom aplikacijom i tako smo završili ovaj vodič u kojemu smo mogli nadići asinhrono programiranje i primjenu koji nam pomažu u održavanju standarda i optimalnosti za naše aplikacije.

wave wave wave wave wave