įvykio kilpa mazge js

Ivykio Kilpa Mazge Js



Node.js yra galinga „Javascript“ sistema, leidžianti vartotojams paleisti „Javascript“ kodą serveryje už naršyklės ribų. Tai neblokuojanti, įvykiais pagrįsta vykdymo aplinka, skirta kurti patikimas keičiamo dydžio žiniatinklio programas. Įvykių ciklas yra svarbi Node.js dalis, leidžianti atlikti užduotis nelaukiant, kol baigsis viena, prieš pradėdami kitą.

Nors „Javascript“ yra vienos gijos kalba, Node.js gali priskirti operacinei sistemai užduotis, leidžiančias jai vienu metu apdoroti kelias užduotis. Keletą užduočių reikia atlikti vienu metu, nes operacijos operacinėje sistemoje yra kelių gijų. Atgalinis skambutis, susietas su kiekviena operacija, įtraukiamas į įvykių eilę ir yra suplanuotas pagal Node.js, kad jis būtų paleistas, kai bus atlikta nurodyta užduotis.

Norėdami parašyti efektyvų ir patikimą Node.js kodą, vartotojas turi gerai suprasti įvykių kilpas. Tai taip pat gali padėti efektyviai šalinti našumo problemas. Įvykių ciklas Node.js taupo atmintį ir leidžia vienu metu atlikti kelis veiksmus nelaukiant, kol baigsis kiekvienas. Terminas „asinchroninis“ reiškia bet kokią „Javascript“ funkciją, kuri veikia fone, neblokuojant gaunamų užklausų.







Prieš pereidami tiesiai prie įvykių kilpų, pažvelkime į skirtingus Javascript programavimo kalbos aspektus.



Javascript kaip asinchroninė programavimo kalba

Pažvelkime į asinchroninio programavimo sąvokas. „Javascript“ yra naudojamas žiniatinklio, mobiliojo ryšio ir darbalaukio programose, tačiau reikia pažymėti, kad „Javascript“ yra vienos gijos sinchroninė kompiuterių programavimo kalba.



Sąvokai suprasti pateikiamas paprastas kodo pavyzdys.





funkcijos metodas1 ( ) {

konsolė. žurnalas ( „1 funkcija“ )

}

funkcijos metodas2 ( ) {

konsolė. žurnalas ( '2 funkcija' )

}

metodas1 ( )

2 metodas ( )

Šiame kode sukuriamos dvi paprastos funkcijos ir pirmiausia iškviečiamas 1 metodas, todėl jis pirmiausia registruoja metodą1, o tada pereina prie kito.

Išvestis



Javascript kaip sinchroninio programavimo kalba

„Javascript“ yra sinchroninė programavimo kalba, kuri žingsnis po žingsnio vykdo kiekvieną eilutę, judant iš viršaus į apačią, vienu metu vykdoma tik viena eilutė. Aukščiau pateiktame pavyzdyje kodas 1 pirmiausia registruojamas terminale, o tada metodas2.

Javascript kaip blokavimo kalba

Kadangi javascript yra sinchroninė kalba, jis turi blokavimo funkciją. Nesvarbu, kiek laiko užtrunka vykstančiam procesui užbaigti, tačiau naujas procesas nebus pradėtas tol, kol nebus baigtas ankstesnis. Aukščiau pateiktame kodo pavyzdyje tarkime, kad 1 metode yra daug kodo scenarijaus, nesvarbu, kiek laiko tai trunka 10 sekundžių arba minutę, metodas2 nebus vykdomas, kol nebus įvykdytas visas 1 metodo kodas.

Vartotojai galėjo tai patirti naršydami. Kai žiniatinklio programa vykdoma naršyklėje, esančioje užpakalinėje dalyje, vykdomas didžiulis kodo gabalas, todėl atrodo, kad naršyklė kuriam laikui yra užšaldyta, o tada vartotojui grąžinama valdymo prieiga. Šis elgesys žinomas kaip blokavimas. Naršyklė negali priimti jokių kitų gaunamų užklausų, kol neapdorota dabartinė užklausa.

Javascript yra vienos gijos kalba

Norint paleisti programą javascript, naudojama gijos funkcija. Gijos vienu metu gali atlikti tik vieną užduotį. Kitos programavimo kalbos palaiko kelių gijų kūrimą ir gali lygiagrečiai vykdyti kelias užduotis, javascript yra tik viena gija, skirta bet kokiam kodo scenarijui vykdyti.

Laukiama Javascript

Kaip matyti iš pavadinimo šiame skyriuje, turime palaukti, kol mūsų užklausa bus apdorota, kad galėtume tęsti. Laukimas gali užtrukti kelias minutes, per kurį nebus patenkintas joks tolesnis prašymas. Jei kodo scenarijus bus vykdomas nelaukiant, kode susidurs su klaida. Tam, kad kodas būtų asinchroninis, kai kurios funkcijos turi būti įdiegtos „Javascript“ arba, tiksliau, „Node.js“.

Dabar, kai supratome skirtingus „Javascript“ aspektus, supraskime sinchroniškumą ir asinchroniškumą keliais paprastais pavyzdžiais.

Sinchroninis kodo vykdymas Javascript

Sinchroninis reiškia, kad kodas vykdomas nuosekliai arba, paprasčiau, žingsnis po žingsnio, pradedant nuo viršaus ir eilutę po eilutės judant žemyn.

Žemiau pateikiamas pavyzdys, kuris gali padėti suprasti:

// application.js

konsolė. žurnalas ( 'vienas' )

konsolė. žurnalas ( 'Du' )

konsolė. žurnalas ( 'Trys' )

Šiame kode yra trys console.log teiginiai, kuriuose kiekvienas ką nors spausdina. Pirma, pirmasis pareiškimas, kuris konsolėje išspausdins 'One', siunčiamas į skambučių krūvą 1 ms (apytiksliai), tada jis registruojamas terminale. Po to antrasis sakinys įstumiamas į skambučių krūvą ir dabar laikas yra 2 ms, pridėjus vieną iš ankstesnio, o tada į konsolę įrašoma 'Du'. Galiausiai paskutinis sakinys įstumiamas į skambučių krūvą, kol kas laikas yra 3 ms ir konsolėje registruojamas „Trys“.

Aukščiau pateiktas kodas gali būti vykdomas iškvietus šią komandą:

mazgo programa. js

Išvestis

Veikimas yra išsamiai paaiškintas aukščiau ir atsižvelgiant į tai, išvestis akies mirksniu prisijungiama prie konsolės:

Asinchroninis kodo vykdymas Javascript

Dabar pakeisime tą patį kodą įvesdami atgalinius skambučius ir kodą paversdami asinchroniniu. Aukščiau pateiktas kodas gali būti pakeistas kaip:

// application.js
funkcija printOne ( perskambink ) {
setTimeout ( funkcija ( ) {
konsolė. žurnalas ( 'vienas' ) ;
perskambink ( ) ;
} , 1000 ) ;
}
funkcija printTwo ( perskambink ) {
setTimeout ( funkcija ( ) {
konsolė. žurnalas ( 'Du' ) ;
perskambink ( ) ;
} , 2000 m ) ;
}
funkcija printThree ( ) {
setTimeout ( funkcija ( ) {
konsolė. žurnalas ( 'Trys' ) ;
} , 3000 ) ;
}
konsolė. žurnalas ( 'Programos pradžia' ) ;
printOne ( funkcija ( ) {
spausdinti du ( funkcija ( ) {
spausdintiTrys ( ) ;
} ) ;
} ) ;
konsolė. žurnalas ( 'Programos pabaiga' ) ;

Šiame aukščiau esančiame kode:

  • Nurodytos trys funkcijos, spausdinančios „Vienas“, „Du“ ir „Trys“, kiekviena funkcija turi atgalinio ryšio parametrą, leidžiantį nuosekliai vykdyti kodą.
  • Skirtasis laikas nustatomas naudojant funkciją setTimeout ir yra console.log sakinys, skirtas spausdinti po tam tikro delsos.
  • Išspausdinami du pranešimai „Programos pradžia“ ir „Programos pabaiga“, kurie nurodo programos pradžią ir pabaigą.
  • Programa pradedama spausdinant „Programos pradžia“, po kurios funkcija printOne vykdoma su 1 sekundės uždelsimu, tada funkcija printTwo vykdoma su 2 sekundžių uždelsimu ir galiausiai funkcija printThree vykdoma su 3 sekundžių uždelsimu. delsimas.
  • Programa nelaukia asinchroninio kodo vykdymo funkcijose setTimeouts, kuri registruoja teiginį „Programos pabaiga“, prieš spausdindama „Vienas“, „Antras“ ir „Trys“.

Išvestis

Paleiskite aukščiau pateiktą kodą vykdydami šią komandą terminale:

mazgo programa. js

Dabar terminalo išvestis būtų rodoma asinchroniškai kaip:

Dabar, kai puikiai suprantame sinchroninį ir asinchroninį vykdymą, pereikime prie mūsų Node.js įvykių ciklo koncepcijos.

Node.js: įvykių ciklo mechanizmas

Tiek sinchroninių, tiek asinchroninių užduočių vykdymą valdo Node.js įvykių ciklas. Vykdymas iškviečiamas iškart paleidus Node.js projektą ir sklandžiai perkelia sudėtingas užduotis į sistemą. Tai užtikrina, kad kitos užduotys gali būti vykdomos sklandžiai pagrindinėje gijoje.

Vizualus įvykio ciklo paaiškinimas Node.js

Įvykių ciklas yra nuolatinis ir pusiau begalinis Node.js. Įvykio ciklas iškviečiamas paleidžiant Node.js kodo scenarijų, ir jis yra atsakingas už asinchroninių API iškvietimą ir procesų iškvietimą. Pažymėkite () ir planavimo laikmačiai atnaujina įvykio ciklo vykdymą.

Programoje Node.js penki pagrindiniai eilių tipai apdoroja atgalinius skambučius:

  • „Laikmačio eilė“, paprastai žinoma kaip „min-heap“, yra atsakinga už atgalinių skambučių, susijusių su „setTimeout“ ir „setInterval“, tvarkymą.
  • Asinchroninių operacijų, tokių kaip „fs“ ir „http“ moduliuose, atgalinius skambučius tvarko „I/O Queue“.
  • „Check Queue“ yra „setImmediate“ funkcijos, kuri yra unikali „Node“, atgaliniai iškvietimai.
  • „Uždaryti eilę“ tvarko atgalinius skambučius, susijusius su bet kurios asinchroninės užduoties uždarymo įvykiu.
  • Galiausiai „Mikro užduoties“ eilėje yra dvi skirtingos eilės:
    • „nextTick“ eilėje yra atgalinių skambučių, susijusių su „process.nextTick“ funkcija.
    • „Pažado“ eilė valdo atgalinius skambučius, susijusius su vietine „Promise“.

Įvykių ciklo funkcija Node.js

Įvykio ciklas veikia pagal konkrečius reikalavimus, kurie valdo atgalinio skambučio vykdymo tvarką. Naudotojo sinchroniniam „Javascript“ kodui suteikiamas prioritetas proceso pradžioje, todėl įvykių ciklas prasideda tik išvalius skambučių krūvą. Ši vykdymo seka atitinka struktūrinį modelį:

Didžiausias prioritetas suteikiamas atgaliniams iškvietimams mikroužduočių eilėje, tada pereinant prie užduočių vykdymo nextTick eilėje, o po to – užduotims pažado eilėje. Tada apdorojami laikmačio eilės atgalinio iškvietimo procesai, o po to po kiekvieno laikmačio atgalinio iškvietimo vėl lankomasi mikroužduočių eilėje. Tada atgaliniai skambučiai įvesties / išvesties, patikrinimo ir uždarymo eilėse vykdomi panašiai kaip mikroužduočių eilė, aplankyta po kiekvienos fazės.

Ciklas ir toliau vykdomas, jei reikia apdoroti daugiau atgalinių skambučių. Kai kodo scenarijus baigiasi arba nebelieka apdoroti atgalinių skambučių, įvykių ciklas baigiasi efektyviai.

Dabar, kai gerai suprantame įvykių kilpą, pažvelkime į jo ypatybes.

Įvykių ciklo ypatybės Node.js

Pagrindinės savybės yra šios:

  • Įvykio ciklas yra begalinis ciklas ir toliau vykdo užduotis, kai tik jas gauna, ir pereina į miego režimą, jei užduočių nėra, bet pradeda veikti, kai tik užduotį gauna.
  • Užduotys įvykių eilėje vykdomos tik tada, kai krūva tuščia, tai reiškia, kad nėra aktyvios operacijos.
  • Atšaukimai ir pažadai gali būti naudojami įvykių cikle.
  • Kadangi įvykių ciklas vadovaujasi abstrakčių duomenų tipo eilės principu, jis įvykdo pirmąją užduotį, tada pereina prie kitos.

Išsamiai supratus įvykio kilpą ir asinchroninių bei sinchroninių vykdymų logiką, skirtingų fazių supratimas gali sustiprinti įvykio ciklo sąvokas.

Node.js Įvykio ciklo fazės

Kaip minėta aukščiau, įvykių ciklas yra pusiau begalinis. Jame yra daug fazių, tačiau kai kurios fazės naudojamos vidiniam tvarkymui. Šios fazės neturi jokios įtakos kodo scenarijui.

Įvykio ciklas seka eilės funkcionalumą ir vykdo užduotį „pirmas įeina“ ir „pirmas išeina“ principu. Suplanuotus laikmačius tvarkys operacinė sistema, kol baigsis jų galiojimo laikas. Tada pasibaigę laikmačiai įtraukiami į atgalinio skambinimo eilę laikmačiams.

Įvykio ciklas vieną po kito vykdo užduotis laikmačio eilėje, kol nebelieka užduočių arba pasiekia maksimalų leistiną užduočių skaičių. Toliau pateiktuose skyriuose paaiškinamos pagrindinės įvykių kilpų fazės.

Laikmačių fazė

Node.js yra laikmačio API, kuri gali suplanuoti funkcijas, kurios turi būti vykdomos ateityje. Pasibaigus skirtam laikui, laikmačio atgalinis skambutis bus atliktas, kai tik bus galima suplanuoti; tačiau gali atsirasti delsa iš operacinės sistemos pabaigos arba dėl kitų atgalinių skambučių vykdymo.

Laikmačių API turi tris pagrindines funkcijas:

  • setTimeout
  • nustatyti Nedelsiant
  • setInterval

Aukščiau nurodytos funkcijos yra sinchroninės. Įvykio ciklo laikmačio fazė apsiriboja funkcijomis setTimeout ir setInterval. Nors tikrinimo funkcija apdoroja funkciją setImmediate.

Panagrinėkime paprastą pavyzdį, kad sustiprintume teorinę dalį:

// application.js

funkcija uždelstaFunkcija ( ) {

konsolė. žurnalas ( „uždelsta funkcija vykdoma pasibaigus laikui“ ) ;

}

konsolė. žurnalas ( 'Programos pradžia' ) ;

setTimeout ( uždelsta funkcija, 2000 m ) ;

konsolė. žurnalas ( 'Programos pabaiga' ) ;

Šiame kode:

  • Programa paleidžiama į terminalą įregistravus teiginį „Programos pradžia“.
  • Tada uždelsta funkcija iškviečiama su 2 ms laikmačiu, kodo scenarijus nesustoja ir toliau tvarko delsą fone.
  • Pareiškimas „Programos pabaiga registruojamas po pirmojo pareiškimo.
  • Po 2 ms delsos uždelstos funkcijos teiginys registruojamas terminale.

Išvestis

Išvestis bus rodoma taip:

Galima pastebėti, kad kodas nesustabdomas, kad uždelsta funkcija būtų apdorota; jis juda į priekį ir po delsos apdorojamas funkcijos atgalinis skambutis.

Laukiantys atgaliniai skambučiai

Įvykių ciklas tikrina įvykius, pvz., failų skaitymą, tinklo veiklą arba įvesties / išvesties užduotis apklausos etape. Svarbu žinoti, kad Node.js šiame apklausos etape apdorojami tik kai kurie įvykiai. Tačiau vėlesnėje įvykio ciklo iteracijoje tam tikri įvykiai gali būti atidėti į laukiančią fazę. Tai yra pagrindinė sąvoka, kurią reikia turėti omenyje optimizuojant ir šalinant Node.js kodą, kuris apima sudėtingas įvykiais pagrįstas operacijas.

Svarbu suprasti, kad laukiančių atgalinių skambučių fazės metu įvykių ciklas prideda atidėtus įvykius į laukiančių atgalinių skambučių eilę ir juos atlieka. Šioje fazėje taip pat tvarkomos kai kurios sistemos sugeneruotos TCP lizdo klaidos, pvz., ECONNREFUSED klaidų įvykiai tam tikrose operacinėse sistemose.

Žemiau pateikiamas pavyzdys, siekiant sustiprinti koncepciją:

// application.js
konst fs = reikalauti ( 'fs' ) ;
funkcija readFileAsync ( filePath, atgalinis skambutis ) {
fs. skaityti failą ( './PromiseText.txt' , 'utf8' , funkcija ( klaida, duomenys ) {
jeigu ( klysti ) {
konsolė. klaida ( ` Klaida skaitymo failas : $ { klysti. žinutę } ` ) ;
} Kitas {
konsolė. žurnalas ( ` Failas turinys : $ { duomenis } ` ) ;
}
perskambink ( ) ;
} ) ;
}
konsolė. žurnalas ( 'Programos pradžia' ) ;
readFileAsync ( './PromiseText.txt' , funkcija ( ) {
konsolė. žurnalas ( „Failo skaitymo atgalinis skambutis atliktas“ ) ;
} ) ;
konsolė. žurnalas ( 'Programos pabaiga' ) ;

Šiame kode:

  • Programa inicijuojama terminale užregistravus teiginį „Programos pradžia“.
  • ReadFileAsync apibrėžiamas asinchroniškai, kad nuskaitytų failo „PromiseText.txt“ turinį. Tai parametrizuota funkcija, kuri vykdo atgalinio skambinimo funkciją po to, kai failas buvo nuskaitytas.
  • Funkcija readFileAsync iškviečiama failo skaitymo procesui pradėti.
  • Failų skaitymo procese programa nesustoja; vietoj to jis pereina prie kito teiginio ir registruoja jį terminale „Programos pabaiga“.
  • Asinchroninis failo skaitymo įvykis apdorojamas fone įvykių cikle.
  • Po to, kai failas buvo nuskaitytas asinchroniškai ir turinys buvo įrašytas į terminalą, programa registruoja failo turinį į terminalą. Po to jis registruoja šį pranešimą „Failo skaitymo atgalinis skambutis įvykdytas“.
  • Įvykio ciklas tvarko laukiančias atgalinio skambinimo operacijas kitame etape.

Išvestis

Pirmiau nurodyto vykdymo rezultatas yra:

Neveikia, paruoškite Node.js fazę

Tuščiosios eigos fazė naudojama vidinėms Node.js funkcijoms tvarkyti, todėl tai nėra standartinė fazė. Tai neturi įtakos kodo scenarijui. Tuščiosios eigos fazė yra tarsi įvykio ciklo pertrauka, kurios metu tvarkomos žemo prioriteto užduotys fone. Paprastas pavyzdys, kaip suprasti šį etapą:

konst { tuščiąja eiga } = reikalauti ( 'idle-gc' ) ;

tuščiąja eiga. ignoruoti ( ) ;

Šiame kode naudojamas „idle-gc“ modulis, leidžiantis nepaisyti tuščiosios eigos fazės. Tai padeda tvarkyti situacijas, kai įvykių ciklas yra užimtas ir foninės užduotys neatliekamos. idle.ignore naudojimas nėra laikomas optimaliu, nes gali kilti našumo problemų.

Apklausos fazė Node.js

Apklausos fazė Node.js veikia taip:

  • Ji tvarko įvykius apklausos eilėje ir atlieka atitinkamas užduotis.
  • Jis nusprendžia, kiek laiko praleisti laukiant ir tikrinant įvesties / išvesties operacijas.

Kai įvykių ciklas patenka į apklausos fazę, nes nėra laikmačio, bus atlikta viena iš toliau nurodytų užduočių:

  • Node.js įvykio ciklo apklausos fazėje laukiantys įvesties / išvesties įvykiai pateikiami eilėje, o tada vykdomi nuoseklia procedūra, vadovaujantis „First In“ ir „First Out“ principu, kol eilė tampa tuščia. Atgalinių skambučių vykdymo metu taip pat veikia nextTick ir microtasks eilės. Tai užtikrina sklandumą ir leidžia efektyviau ir patikimiau atlikti I/O operacijas.
  • Jei eilė tuščia, o scenarijaus nesuplanavo funkcija setImmediate (), tada įvykio ciklas baigsis ir pereis į kitą fazę (patikrinimas). Kita vertus, jei scenarijaus planavimą atliko funkcija setImmediate (), įvykių ciklas leidžia įtraukti atgalinius skambučius į eilę, kurią ji vykdys.

Tai geriausiai iliustruoja paprastas kodo pavyzdys:

setTimeout ( ( ) => {

konsolė. žurnalas ( „Asinchronizavimo operacija baigta“ ) ;

} , 2000 m ) ;

konsolė. žurnalas ( 'Pradėti' ) ;

nustatyti Nedelsiant ( ( ) => {

konsolė. žurnalas ( 'setImmediate callback executed' ) ;

} ) ;

konsolė. žurnalas ( 'Galas' ) ;

Šiame kode:

  • Du pranešimai „Start“ ir „End“ rodo programos pradžią ir pabaigą.
  • Funkcija setTimeout() nustato atgalinio skambučio funkciją su 2 ms uždelsimu ir terminale registruoja „Asinchronizavimo operacija baigta“.
  • Funkcija setImmediate() registruoja pranešimą „setImmediate callback executed“ terminale po to, kai terminale buvo užregistruotas pranešimas „Start“.

Išvestis

Išvestyje būtų rodomi pranešimai su vos minutės stebėjimu, kad „Asinchronizavimo operacija baigta“ užtrunka ir išspausdinama po pranešimo „Pabaiga“:

Node.js tikrinimo fazė

Po apklausos etapo vykdomi atgaliniai skambučiai tikrinimo fazėje. Jei kodo scenarijus suplanuotas naudojant funkciją setImmediate() ir apklausos funkcija yra nemokama, įvykio ciklas veikia tiesiogiai pereidamas į tikrinimo fazę, o ne nenaudojamas. Funkcija setImmediate() yra unikalus laikmatis, veikiantis skirtingose ​​įvykio ciklo fazėse.

Libuv API naudojama planuoti atgalinio skambučio vykdymą po apklausos etapo vykdymo. Vykdant kodą įvykio kilpa patenka į apklausos fazę, kurioje laukia gaunamų ryšio užklausų. Kitu atveju, jei atgalinis skambutis suplanuotas naudojant setImmediate() funkciją, o apklausos fazė nutraukiama be jokios veiklos, jis pereis į patikrinimo fazę, o ne lauks. Apsvarstykite toliau pateiktą pavyzdį, kad suprastumėte:

// application.js

konsolė. žurnalas ( 'Pradėti' ) ;

nustatyti Nedelsiant ( ( ) => {

konsolė. žurnalas ( „Skubus atgalinis skambutis“ ) ;

} ) ;

konsolė. žurnalas ( 'Galas' ) ;

Šiuo kodu prie terminalo prisijungiami trys pranešimai. Funkcija setImmediate () galiausiai siunčia atgalinį skambutį, kad užregistruotų pranešimą ' Greitas perskambinimas “ į terminalą.

Išvestis

Aukščiau pateikto kodo išvestis bus rodoma tokia seka:

Node.js uždaryti atgalinius skambučius

Node.js naudoja šią uždarymo fazę, kad paleistų atgalinius skambučius, kad uždarytų įvykius ir užbaigtų įvykių ciklo iteraciją. Uždarius ryšį, įvykio kilpa tvarko uždarymo įvykius šioje fazėje. Šioje įvykių ciklo fazėje „nextTick()“ ir mikroužduotys generuojamos ir apdorojamos panašiai kaip kitose fazėse.

Funkcija process.exit naudojama įvykio kilpai užbaigti bet kuriuo momentu. Įvykio ciklas nepaisys jokių laukiančių asinchroninių operacijų ir Node.js procesas bus nutrauktas.

Paprastas pavyzdys, kurį reikia apsvarstyti, yra:

// application.js
konst neto = reikalauti ( 'tinklas' ) ;
konst serveris = neto. sukurti serverį ( ( lizdas ) => {
lizdas. įjungta ( 'Uždaryti' , ( ) => {
konsolė. žurnalas ( 'Lizdas uždarytas' ) ;
} ) ;
lizdas. įjungta ( 'duomenys' , ( duomenis ) => {
konsolė. žurnalas ( „Gauti duomenys:“ , duomenys. toString ( ) ) ;
} ) ;
} ) ;
serveris. įjungta ( 'Uždaryti' , ( ) => {
konsolė. žurnalas ( „Serveris uždarytas“ ) ;
} ) ;
konst uostas = 3000 ;
serveris. klausyk ( uostas, ( ) => {
konsolė. žurnalas ( `Serveris klausosi prievado $ { uostas } ` ) ;
} ) ;
setTimeout ( ( ) => {
konsolė. žurnalas ( „Serveris uždaromas po 10 sekundžių“ ) ;
serveris. Uždaryti ( ) ;
procesas. išeiti ( ) ;
} , 10 000 ) ;

Šiame kode:

  • const net = reikalauti ('net') “ importuoja tinklo modulį, reikalingą TCP serveriui valdyti ir „ const serveris = net.createServer((socket) => { “ sukuria naują TCP serverio egzempliorių.
  • socket.on('uždaryti', () => {… } “ klausosi „uždaryti“ visuose lizduose. Kai lizdo jungtis uždaroma, terminale užregistruojamas pranešimas „Socket Closed“.
  • socket.on('duomenys', (duomenys) => {} “ patikrina gaunamus duomenis iš visų atskirų lizdų ir išspausdina juos naudodama funkciją „.toString()“.
  • server.on('uždaryti', () => {…} “ patikrina, ar pačiame serveryje nėra įvykio „uždaryti“, o nutraukus serverio ryšį į terminalą registruoja pranešimą „Serveris uždarytas“.
  • server.listen(port, () => {…} “ klausosi įeinančių jungčių prievade.
  • setTimeout(() => {…} “ nustato 10 ms laikmatį serverio uždarymui.

Tuo baigiama diskusija apie įvairius Node.js įvykio ciklo etapus. Prieš darydami išvadą, aptarkime paskutinį dalyką, ty kaip išeiti iš įvykio ciklo Node.js.

Išėjimas iš įvykio ciklo Node.js

Įvykio ciklas yra vykdymo fazėje tol, kol visose įvykių ciklo fazių eilėse yra tam tikrų užduočių. Įvykio ciklas baigiasi po to, kai išsiunčiama išėjimo fazė, o išėjimo klausytojo atgalinis skambutis grįžta, jei eilėse nėra užduočių.

Aiškus būdas užbaigti įvykio kilpą yra naudoti „.exit“ metodą. Aktyvūs Node.js procesai iš karto nutrūks, kai tik bus iškviesta process.exit funkcija. Visi suplanuoti ir laukiantys įvykiai bus atmesti:

procesas. įjungta ( 'išeiti' , ( kodas ) => {

konsolė. žurnalas ( „Išeinama naudojant išėjimo kodą : $ { kodas } ` ) ;

} ) ;

procesas. išeiti ( 1 ) ;

Vartotojai gali klausytis .exit funkcijos. Reikia pažymėti, kad funkcija „.exit“ turi būti sinchroninė, nes Node.js programa išeis, kai tik išklausys šį įvykį.

Tai baigia diskusiją apie renginį. Išsamus straipsnis, apimantis visas sąvokas, etapus ir pavyzdžius, susijusius su įvykių ciklu.

Išvada

Prieš suprantant įvykio kilpą, sinchroninių ir asinchroninių sąvokų apžvalga gali padėti suprasti kodo srautą įvykio cikle. Sinchroninis vykdymas reiškia laipsnišką vykdymą, o asinchroninis vykdymas reiškia kai kurių veiksmų sustabdymą nelaukiant, kol jie bus baigti. Straipsnyje aptariamas renginio ciklo veikimas, visos fazės ir tinkami pavyzdžiai.