In Node.js daudzi no vidē esošajiem objektiem izstaro notikumus, piemēram, TCP serveris emitē notikuma veidu savienot katru reizi, kad savienojas jauns klients vai failu straume izstaro informāciju katru reizi, kad tiek nolasīta kāda informācija.
Šis iekšā Node.js tiek saukti par notikumu izstarotājiem, kas ļauj izstrādātājiem abonēt notikumus, ja tas abonē kādu funkciju atzvani kas tiks izsaukts katru reizi, kad notikums notikuma izstarotājā notiks. Mēs pat varam izveidot savus notikumu izstarotājus, pateicoties pseidoklasei EventEmitter.
Tomēr, lai iekļūtu notikumu izplatītājos, mums vispirms ir jābūt skaidrībai par dažiem jēdzieniem, piemēram, dažiem šo funkciju modeļiem, notikumu veidiem un pat klausītājiem.
PrasībasLai veiktu šajā apmācībā piedāvātos vingrinājumus, mums ir jābūt funkcionālai instalācijai Node.js mūsu sistēmā mēs varam apskatīt šo pamācību, pirms turpināt tajā iedziļināties. Ir arī svarīgi, lai varētu piekļūt bagātināta teksta redaktoram, lai kodētu piemērus, mēs varam izmantot visu, kas mums šķiet ērti, tomēr, lai to ērti izmantotu, mēs iesakām Cildens teksts o NotePad ++, kuriem ir arī sintakses spraudņi JavaScript Y HTML.
Atzvanīšanas modelis
Asinhronā programmēšana neizmanto funkciju atdevi funkcijās, lai norādītu, ka šī funkcija ir tikko pabeigta, bet tā atsaucas uz slaveno atzvanīšanu pēc operācijas pabeigšanas, lai mūsu programma varētu turpināties. JavaScript Es vedu pie šāda veida programmēšanas, aplūkosim piemēru Nedod kas lasa failu un ielādē tā saturu atmiņā:
var fs = prasīt ('fs'); fs.readFile ('file.txt', function (err, fileContent) {if (err) {mest kļūdu;} console.log ('Faila saturs:', fileContent.toString ());});Mēs šeit darām to, ka mēs sūtām anonīmu funkciju kā funkcijas otro argumentu fs.readFile, un kā mēs varam redzēt, ka pirmais atzvanīšanas funkcijas arguments ir kļūdas objekts, kuram kļūdas gadījumā būs kļūdas klases eksemplārs.
Raksts pasākuma izstarotājam
Iepriekšējais stils darbojas lieliski, ja vēlamies paziņot, ka funkcija, kuru mēs izpildām, pabeidz savu darbu, bet gadījumā, ja šīs izpildes laikā vai vairākas reizes notiek vairāki notikumi, šis stils nedarbosies tā, kā mēs vēlētos. Piemēram, ja mēs vēlamies saņemt paziņojumu katru reizi, kad informācija ir pieejama kontaktligzdā, tā ir šāda veida funkcija atzvani standarts mums daudz nepalīdzēs, taču tieši šeit mums var palīdzēt pasākuma radītājs.
Notikumu izstarotājs ir nekas cits kā objekts, kas, kā norāda nosaukums, izstaro notikumu, kur a klausītājs tā ir daļa no koda, kas saistās ar šo izstarotāju un klausās noteikta veida notikumus, piemēram:
var req = http.request (opcijas, funkcija (atbilde) {response.on ("dati", funkcija (dati) {console.log ("Daži atbildes dati", dati);}); response.on ("beigas" , function () {console.log ("pabeigta atbilde");});}); req.end ();Šis ir tikai paskaidrojošs kods, kurā mēs varam redzēt dažas darbības, lai veiktu pieprasījumu HTTP uz attālo serveri, bet tas ļauj mums redzēt, kā atbildes objekts ir notikumu emitētājs, kas var izstarot ne tikai dati Y beigas bet cita veida notikumi līdzīgi.
Notikumu veidi
Saskaņā ar iepriekšējo piemēru mēs redzējām, ka izstarotajiem notikumiem vienmēr ir veids, ko šajā gadījumā attēlo virkne. "dati"Y"beigas”, Kas būs notikuma izdevēja noteiktas patvaļīgas virknes.
Notikumu emitētājs ir vispārējs interfeiss, kas kalpo jebkura veida notikumiem, taču ir īpašs gadījums tā ieviešanā Nedod un tas ir notikums kļūda, kur katrs notikums vidē izstaro šāda veida notikumu katru reizi, kad rodas kļūda, un, ja izstrādātājs izvēlas neklausīties šāda veida notikumus un rodas kļūda, notikuma radītājs to pamanīs un šajā gadījumā izvirzīs izņēmumu . Tālāk redzēsim, kā mēs varam simulēt šo uzvedību:
var em = jauns (pieprasīt ('notikumi'). EventEmitter) (); em.emit ('event1'); em.emit ('kļūda', jauna kļūda ('Mana kļūda'));Izlaižot to caur konsoli, mēs redzam, kā Nedod norāda, ka mēs nerīkojamies ar kļūdu, tādējādi radot neķertu izņēmumu:
Tā kā mēs esam redzējuši, kā notikumi uzvedas vispārīgi, apskatīsim, kā mēs izmantojam notikumu emitētāja API.
Izmantojot notikumu emitētāja API
Jebkurš objekts, kas īsteno notikumu izstarotāja modeli, īsteno virkni notikumu, kā mēs varam redzēt zemāk:
.addListener - .onŠī metode ļauj notikuma veidam pievienot klausītāju.
.vienpadsmitIzmantojot šo metodi, mēs varam piesaistīt klausītāju notikuma veidam, ņemot vērā, ka tas tiks izsaukts vismaz vienu reizi.
.removeEventListenerŠī metode ļaus mums noņemt klausītāju no jebkura notikuma.
.removeAllEventListenersVisbeidzot, šī metode palīdz mums noņemt visus klausītājus noteikta veida notikumam.
Jau redzot, kāda ir katra no tām funkcija, redzēsim, kā mēs tās izmantojam mūsu programmās.
Atzvanos izmanto .addListener () vai .on ()
Norādot notikuma veidu un funkciju atzvani, mēs varam ierakstīt darbību, kas jāveic, kad notiek konkrēts notikums. Piemēram, ja vēlamies mūs informēt, ka daļa datu ir pieejama un izstaro tipa datu notikumu, mēs varam rīkoties šādi:
funkcija ReceiveData (dati) {console.log ("Dati tika iegūti:% j", dati); } readFlow.addListener ("dati", ReceiveData);Mēs varam izmantot arī metodi .on () kas ir tikai saīsne, aplūkosim iepriekšējā koda ekvivalentu:
funkcija ReceiveData (dati) {console.log ("Dati tika iegūti:% j", dati); } readFlow.on ("dati", ReceiveData);Mēs pat varam saviem pasākumiem pievienot vairākus klausītājus, lai vienā raidītājā klausītos viena veida notikumus, piemēram:
Šajā piemērā tas, kas tiek darīts, ir divu funkciju saistīšana ar datu tipa notikumu, un, kad pēc datu notikuma emitēšanas abas virknes tiks izdrukātas. Ir svarīgi atzīmēt, ka pasākuma izdevējs ir atbildīgs par visu izsaukšanu klausītājiem reģistrēts notikuma veidam, un tas tos izsauks tādā secībā, kādā tie tika reģistrēti, kas nozīmē:
- Klausītāju nevar piezvanīt uzreiz pēc notikuma izstarošanas, iespējams, ka citi klausītāji tiek piezvanīti iepriekš.
- Izņēmumu neuztveršana ir neveselīga mūsu koda uzvedība, tādēļ, ja kāds no šiem klausītājiem izdara kļūdu un netiek uztverts, iespējams, ka daži klausītāji netiek izsaukti, un to mēs varam ilustrēt šādā piemērā:
Šajā piemērā otrais klausītājs netiks izsaukts, jo pirmais iemeta kļūdu.
Izmantojot .removeListener ()
Ja mēs vairs nevēlamies saņemt informāciju par konkrēta notikuma vai objekta izmaiņām, mēs varam pārtraukt tā ierakstīšanu, norādot notikuma veidu un atzvanīšanas funkciju šādi:
Izmantojot. Vienreiz ()
Gadījumā, ja mūsu lietojumprogramma klausās notikumu, kas notiks vismaz vienu reizi, vai ja mēs esam ieinteresēti, lai tas notiktu tikai vienu reizi, mēs varam izmantot .vienpadsmit (), kas pievieno klausītāju un noņem to pēc pirmā notikuma:
Izmantojot .removeAllListeners ()
Visbeidzot, mēs varam noņemt visus klausītājus no konkrēta notikuma veida no notikuma izstarotāja šādi:
emitents.removeAllListeners (tips);
Notikuma izstarotāja izveidošana
Notikumu izstarotājs nodrošina mums vispārīgu saskarņu veidošanas veidu, jo mēs esam saistoši notikumi, nevis funkcijas, padarot mūsu programmu elastīgāku, pat ja mēs vēlamies izmantot Node.js Visā mūsu pieteikumā mēs varam izveidot pseidoklasi un mantot no EventEmitter sekojoši:
util = prasīt ('util'); var EventEmitter = pieprasīt ('notikumi'). var MyClass = function () {} util.inherits (MyClass, EventEmitter);Tādā veidā metodes EventEmitter Tie būs pieejami mūsu instancē, un mēs varam tos izmantot bez problēmām un šādā veidā Mana klase var izstarot notikumus:
MyClass.prototype.someMethod = function () {this.emit ("pielāgots notikums", "1. arguments", "2. arguments"); };Lūk, kad kāda metode tiek saukts instancē Mana klase, piemērs izstaro notikumu ar nosaukumu pielāgots pasākums, kur tas savukārt izstaro divus dažādus datus, 1. argumentu un 2. argumentu, kas tiks nosūtīti notikuma klausītājiem. Visbeidzot gadījumos Mana klase klienta pusē varat klausīties pielāgots pasākums sekojoši:
var MyClass = jauna MyClass (); MyClass.on ('pielāgots notikums', funkcija (str1, str2) {console.log ('Pielāgots notikums klausījās ar argumentiem str1% s un str2% s!', Str1, str2);});Kā redzam, notikumu izmantošana kopā ar notikumu izstarotāju palīdz mums sazināties ar mūsu lietojumprogrammu, un tā mēs pabeidzām šo apmācību, kurā mēs varējām pārsniegt asinhrono programmēšanu un prakses pielietošanu, kas palīdz mums saglabāt standarta un optimālu modelis mūsu lietojumprogrammām.