Įvykių tvarkymas „Node.js“

In Node.js daugelis aplinkoje esančių objektų skleidžia įvykius, pavyzdžiui, TCP serveris skleidžia tipo įvykį Prisijungti kiekvieną kartą prisijungus naujam klientui arba failų srautui skleidžiant informaciją kaskart skaitant informaciją.

Tai į Node.js vadinami įvykių skleidėjais, kurie leidžia kūrėjams užsiprenumeruoti įvykius ten, kur jie užsisako funkciją perskambink kuris bus iškviestas kiekvieną kartą, kai įvyks įvykio skleidėjo įvykis. Pseudoklasės dėka mes netgi galime sukurti savo renginių skleidėjus EventEmitter.

Tačiau norėdami patekti į renginių skleidėjus, pirmiausia turime aiškiai suprasti kai kurias sąvokas, pavyzdžiui, kai kuriuos šių funkcijų modelius, įvykių tipus ir net klausytojus.

ReikalavimaiNorėdami atlikti šioje pamokoje siūlomus pratimus, turime turėti funkcinį diegimą Node.js mūsų sistemoje galime pažvelgti į šią mokymo programą, prieš tęsdami jos gilinimąsi. Taip pat svarbu turėti galimybę pasiekti turtingo teksto redaktorių, kad būtų galima koduoti pavyzdžius, mes galime naudoti viską, kas mums atrodo patogu, tačiau dėl patogumo rekomenduojame Aukščiausias tekstas o „NotePad ++“, kurie taip pat turi sintaksės papildinius „JavaScript“ Y HTML.

Skambinimo modelis


Asinchroninis programavimas nenaudoja funkcijų reikšmių grąžinimo, nurodydamas, kad ta funkcija ką tik baigta, tačiau jis įjungia garsųjį atgalinį skambutį, kai operacija yra baigta, kad mūsų programa galėtų tęstis. „JavaScript“ Aš vedu prie tokio tipo programavimo, pažiūrėkime pavyzdį Neduok kuris skaito failą ir įkelia jo turinį į atmintį:
 var fs = reikalauti ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {metimo klaida;} console.log ('Failo turinys:', fileContent.toString ());});
Čia mes darome tai, kad siunčiame anoniminę funkciją kaip antrąjį funkcijos argumentą fs.readFile, ir kaip mes galime pamatyti pirmąjį atšaukimo funkcijos argumentą yra klaidos objektas, kuris turės klaidos klasės egzempliorių, jei įvyks klaida.

Modelis renginio skleidėjui


Ankstesnis stilius puikiai veikia, kai norime pranešti, kad vykdoma funkcija baigia savo darbą, tačiau tuo atveju, kai vykdant šį įvykį ar daug kartų įvyksta keli įvykiai, šis stilius neveiks taip, kaip norime. Pavyzdžiui, jei norime, kad mums būtų pranešta kiekvieną kartą, kai informacija yra prieinama lizde, tai tipo funkcija perskambink standartas mums daug nepadės, tačiau čia mums gali padėti renginio skleidėjas.

Įvykio skleidėjas yra ne kas kita, kaip objektas, kuris, kaip rodo jo pavadinimas, skleidžia įvykį, kai a klausytojas tai yra kodo dalis, kuri jungiasi prie šio spinduolio ir klausosi tam tikrų tipų įvykių, tokių kaip:

 var req = http.request (parinktys, funkcija (atsakymas) {response.on ("duomenys", funkcija (duomenys) {console.log ("Kai kurie atsakymo duomenys", duomenys);}); response.on ("pabaiga" , function () {console.log ("baigtas atsakymas");});}); req.end ();
Tai grynai aiškinamasis kodas, kuriame matome kai kuriuos užklausos pateikimo veiksmus HTTP į nuotolinį serverį, tačiau tai leidžia mums pamatyti, kaip atsako objektas yra įvykių skleidėjas, kuris gali skleisti ne tik duomenis Y galas bet ir kitų tipų įvykiai.

Įvykių tipai


Remiantis ankstesniu pavyzdžiu, matėme, kad skleidžiami įvykiai visada turi tipą, kurį vaizduoja eilutė, šiuo atveju "duomenis"Y"galas“, Tai bus savavališkos įvykio išdavėjo nurodytos eilutės.

Įvykių skleidėjas yra bendra sąsaja, aptarnaujanti bet kokio tipo įvykius, tačiau įgyvendinant yra ypatingas atvejis Neduok ir tai yra įvykis klaida, kai kiekvienas įvykis aplinkoje skleidžia tokio tipo įvykį kiekvieną kartą, kai įvyksta klaida, ir jei kūrėjas nusprendžia neklausyti tokio tipo įvykių ir įvyksta klaida, įvykio skleidėjas tai pastebės ir tokiu atveju iškels išimtį . Pažvelkime į šį kodą, kaip galime imituoti šį elgesį:

 var em = naujas (reikalauti ('įvykiai'). EventEmitter) (); em.emit ('event1'); em.emit ('klaida', nauja klaida ('Mano klaida'));
Jei paleisime jį per konsolę, pamatysime, kaip tai padaryti Neduok nurodo, kad klaidos nesprendžiame, todėl sukuriame nepastebimą išimtį:

Kadangi matėme, kaip įvykiai elgiasi apskritai, pažiūrėkime, kaip naudojame įvykių skleidėjo API.

Naudojant įvykių skleidėjo API


Bet koks objektas, įgyvendinantis įvykių skleidėjo modelį, įgyvendina keletą įvykių, kaip matome toliau:

.addListener - .onŠis metodas leidžia pridėti klausytoją prie įvykio tipo.
.vienuolikaNaudodami šį metodą galime susieti klausytoją su įvykio tipu, atsižvelgiant į tai, kad jis bus iškviestas bent kartą.
.removeEventListenerŠis metodas leis mums pašalinti klausytoją iš bet kurio įvykio.
.removeAllEventListenersGaliausiai, šis metodas padeda pašalinti visus klausytojus tam tikro tipo įvykiui.
Jau pamatę, kokia yra kiekvieno iš jų funkcija, pažiūrėkime, kaip mes juos naudojame savo programose.

Skambinant atgal .addListener () arba .on ()


Nurodydami įvykio tipą ir funkciją perskambink, galime įrašyti veiksmus, kurių reikia imtis įvykus konkrečiam įvykiui. Pavyzdžiui, jei norime būti informuoti, kad dalis duomenų yra prieinama ir skleidžia tipo duomenų įvykį, galime atlikti šiuos veiksmus:
 funkcija ReceiveData (duomenys) {console.log ("Duomenys buvo gauti:% j", duomenys); } readFlow.addListener ("duomenys", gauti duomenys);
Taip pat galime naudoti metodą .on () kuris yra tik spartusis klavišas, pažiūrėkime ankstesnio kodo atitikmenį:
 funkcija ReceiveData (duomenys) {console.log ("Duomenys buvo gauti:% j", duomenys); } readFlow.on ("duomenys", gauti duomenys);
Mes netgi galime pridėti kelis klausytojus, kad mūsų renginiai galėtų klausytis to paties tipo įvykių tame pačiame siųstuve, pavyzdžiui:

Šiame pavyzdyje dvi funkcijos yra susietos su duomenų tipo įvykiu, o kai duomenų įvykis bus išsiųstas, abi eilutės bus atspausdintos. Svarbu pažymėti, kad įvykio davėjas yra atsakingas už skambučius visiems klausytojų užregistruotas įvykio tipui, ir paskambins jiems tokia tvarka, kokia jie buvo užregistruoti, o tai reiškia:

  • Klausytojui negalima paskambinti iškart po įvykio skleidimo, gali būti, kad kiti klausytojai yra paskambinti anksčiau.
  • Negauti išimčių yra nesveikas mūsų kodo elgesys, taigi, jei kuris nors iš šių klausytojų įveda klaidą ir nėra sugautas, gali būti, kad kai kurie klausytojai nebus pakviesti, o tai galime iliustruoti šiame pavyzdyje:

Šiame pavyzdyje antrasis klausytojas nebus iškviestas, nes pirmasis suklydo.

Naudojant .removeListener ()


Jei bet kuriuo metu nebenorime būti informuoti apie konkretaus įvykio ar objekto pakeitimus, galime sustabdyti jo įrašymą, nurodydami įvykio tipą ir atgalinio ryšio funkciją:

Naudojant .once ()


Jei mūsų programa klauso įvykio, kuris įvyks bent kartą, arba jei mes esame suinteresuoti, kad tai įvyktų tik vieną kartą, galime naudoti .vienuolika(), kuris prideda klausytoją ir pašalina jį, kai įvyksta pirmasis įvykis:

Naudojant .removeAllListeners ()


Galiausiai iš įvykio skleidėjo galime pašalinti visus tam tikro tipo įvykio klausytojus:
 emitent.removeAllListeners (tipas);

Renginio skleidėjo kūrimas


Įvykių skleidėjas suteikia mums bendrą sąsajų kūrimo būdą, nes mes įpareigojame įvykius, o ne funkcijas, todėl mūsų programa yra lankstesnė, net jei norime naudoti Node.js Visoje mūsų programoje galime sukurti pseudo klasę ir paveldėti iš jos EventEmitter taip:
 util = reikalauti ('util'); var EventEmitter = reikalauti ('events'). var MyClass = function () {} util.inherits (MyClass, EventEmitter);
Tokiu būdu metodai EventEmitter Jie bus prieinami mūsų instancijai ir mes galime juos naudoti be problemų ir tokiu būdu Mano klasė gali skleisti įvykius:
 MyClass.prototype.someMethod = function () {this.emit ("pasirinktinis įvykis", "1 argumentas", "2 argumentas"); };
Štai kada koks nors metodas yra vadinamas pavyzdžiu Mano klasė, pavyzdys skleidžia įvykį pavadinimu pasirinktinis renginys, kur savo ruožtu skleidžia du skirtingus duomenis, 1 argumentą ir 2 argumentą, kurie bus išsiųsti įvykio klausytojams. Pagaliau tais atvejais Mano klasė kliento pusėje galite klausytis pasirinktinis renginys taip:
 var MyClass = nauja MyClass (); MyClass.on ('pasirinktinis įvykis', funkcija (str1, str2) {console.log ('Priskirtas įvykis klausomas argumentais str1% s ir str2% s!', Str1, str2);});
Kaip matome, įvykių naudojimas kartu su įvykių skleidėju padeda mums bendrauti su mūsų programa ir taip baigėme šią mokymo programą, kur galėjome ne tik asinchroniškai programuoti ir taikyti praktiką, padedančią išlaikyti standartinį ir optimalų modelis. mūsų programoms.

wave wave wave wave wave