tapahtumasilmukka solmun js:ssä

Tapahtumasilmukka Solmun Js Ssa



Node.js on tehokas Javascript-kehys, jonka avulla käyttäjät voivat suorittaa Javascript-koodia palvelimella selaimen ulkopuolella. Se on estämätön, tapahtumapohjainen ajonaikainen ympäristö luotettavien skaalautuvien verkkosovellusten rakentamiseen. Tapahtumasilmukka on tärkeä osa Node.js:ää, jonka avulla voit tehdä tehtäviä odottamatta yhden valmistumista ennen kuin aloitat toisen.

Vaikka Javascript on yksisäikeinen kieli, Node.js voi määrittää tehtäviä käyttöjärjestelmälle, jolloin se voi käsitellä useita tehtäviä samanaikaisesti. Useita tehtäviä on suoritettava samanaikaisesti, koska käyttöjärjestelmän toiminnot ovat monisäikeisiä. Kuhunkin toimintoon liittyvä takaisinsoitto lisätään tapahtumajonoon, ja Node.js ajoittaa sen suoritettavaksi, kun määritetty tehtävä on suoritettu.

Tehokkaan ja luotettavan Node.js-koodin kirjoittaminen edellyttää, että käyttäjällä on vankka ymmärrys tapahtumasilmukaista. Se voi myös auttaa suorituskykyongelmien vianmäärityksessä tehokkaasti. Node.js:n tapahtumasilmukka säästää muistia ja antaa sinun tehdä useita asioita kerralla ilman, että sinun tarvitsee odottaa jokaisen valmistumista. Termi 'asynkroninen' viittaa mihin tahansa Javascript-toimintoon, joka toimii taustalla estämättä saapuvia pyyntöjä.







Ennen kuin siirryt suoraan tapahtumasilmukoihin, katsokaamme Javascript-ohjelmointikielen eri puolia.



Javascript asynkronisena ohjelmointikielenä

Katsotaanpa asynkronisen ohjelmoinnin käsitteitä. Javascriptiä käytetään verkko-, mobiili- ja työpöytäsovelluksissa, mutta on huomattava, että Javascript on yksisäikeinen, synkroninen tietokoneohjelmointikieli.



Yksinkertainen koodiesimerkki annetaan käsitteen ymmärtämiseksi.





funktiomenetelmä 1 ( ) {

konsoli. Hirsi ( 'toiminto 1' )

}

funktiomenetelmä 2 ( ) {

konsoli. Hirsi ( 'toiminto 2' )

}

menetelmä 1 ( )

menetelmä 2 ( )

Tässä koodissa luodaan kaksi yksinkertaista funktiota ja menetelmä1 kutsutaan ensin, joten se kirjaa ensin metodi1 ja siirtyy sitten seuraavaan.

Lähtö



Javascript synkronisena ohjelmointikielenä

Javascript on synkroninen ohjelmointikieli ja suorittaa jokaisen rivin askel askeleelta siirtyen ylhäältä alas ja vain yksi rivi suoritetaan kerrallaan. Yllä annetussa esimerkkikoodissa menetelmä1 kirjataan ensin päätteeseen ja sitten metodi2.

Javascript estokielinä

Synkronisen kielen javascriptillä on estotoiminto. Ei ole väliä kuinka kauan meneillään olevan prosessin loppuun saattaminen kestää, mutta uutta prosessia ei aloiteta ennen kuin edellinen on saatu päätökseen. Yllä olevassa koodiesimerkissä menetelmässä 1 on paljon koodikomentosarjaa riippumatta siitä, kuinka paljon aikaa se vie 10 sekuntia tai minuutti, metodia 2 ei suoriteta ennen kuin kaikki menetelmän 1 koodi on suoritettu.

Käyttäjät ovat saattaneet kokea tämän selatessaan. Kun verkkosovellus suoritetaan selaimessa taustalla, suoritetaan valtava koodipala, joten selain näyttää olevan jäätynyt jonkin aikaa ennen kuin se palauttaa hallintaoikeudet käyttäjälle. Tämä toiminta tunnetaan estämisenä. Selain ei voi vastaanottaa muita saapuvia pyyntöjä ennen kuin nykyinen pyyntö on käsitelty.

Javascript on yksisäikeinen kieli

Ohjelman suorittamiseen javascriptissä käytetään säiettätoimintoa. Säikeet pystyvät suorittamaan vain yhden tehtävän kerrallaan. Muut ohjelmointikielet tukevat monisäikeisyyttä ja voivat ajaa useita tehtäviä rinnakkain, javascript sisältää vain yhden säikeen minkä tahansa koodin suorittamiseen.

Odotetaan Javascriptissä

Kuten tässä osiossa olevasta nimestä käy ilmi, meidän on odotettava pyyntömme käsittelyä jatkaaksemme. Odotus voi kestää useita minuutteja, jolloin muita pyyntöjä ei käsitellä. Jos koodiskripti etenee odottamatta, koodi kohtaa virheen. Jotkut toiminnot tulee toteuttaa Javascriptissä tai tarkemmin Node.js:ssä, jotta koodista tulee asynkroninen.

Nyt kun olemme ymmärtäneet Javascriptin eri näkökohdat, ymmärtäkäämme synkroninen ja asynkroninen muutamien yksinkertaisten esimerkkien avulla.

Koodin synkroninen suoritus Javascriptissä

Synkroninen tarkoittaa, että koodi suoritetaan peräkkäin tai yksinkertaisemmin askel askeleelta alkaen ylhäältä ja siirtymällä alas rivi riviltä.

Alla on esimerkki, joka voi auttaa ymmärtämään:

// application.js

konsoli. Hirsi ( 'Yksi' )

konsoli. Hirsi ( 'Kaksi' )

konsoli. Hirsi ( 'Kolme' )

Tässä koodissa on kolme console.log-lausetta, joista jokainen tulostaa jotain. Ensin ensimmäinen lauseke, joka tulostaa konsolissa 'Yksi', lähetetään puhelupinoon 1 ms:n ajaksi (arvioitu), minkä jälkeen se kirjataan päätelaitteeseen. Sen jälkeen toinen lause työnnetään puhelupinoon ja nyt on aika 2 ms, johon on lisätty yksi edellisestä ja sitten se kirjaa konsoliin 'Two'. Lopuksi viimeinen lause työnnetään puhelupinoon toistaiseksi aika on 3ms ja se kirjaa 'Kolme' konsoliin.

Yllä oleva koodi voidaan suorittaa kutsumalla seuraava komento:

solmusovellus. js

Lähtö

Toiminta on selitetty yllä yksityiskohtaisesti ja sitä huomioimalla tulos kirjautuu konsoliin silmänräpäyksessä:

Asynkroninen koodin suoritus Javascriptissä

Refaktoroidaan nyt sama koodi ottamalla käyttöön takaisinkutsut ja tekemällä koodi asynkroniseksi. Yllä oleva koodi voidaan muuttaa seuraavasti:

// application.js
toiminto printOne ( soita takaisin ) {
setTimeout ( toiminto ( ) {
konsoli. Hirsi ( 'Yksi' ) ;
soita takaisin ( ) ;
} , 1000 ) ;
}
toiminto printTwo ( soita takaisin ) {
setTimeout ( toiminto ( ) {
konsoli. Hirsi ( 'Kaksi' ) ;
soita takaisin ( ) ;
} , 2000 ) ;
}
toiminto printThree ( ) {
setTimeout ( toiminto ( ) {
konsoli. Hirsi ( 'Kolme' ) ;
} , 3000 ) ;
}
konsoli. Hirsi ( 'Ohjelman alku' ) ;
printOne ( toiminto ( ) {
tulosta Kaksi ( toiminto ( ) {
tulostaKolme ( ) ;
} ) ;
} ) ;
konsoli. Hirsi ( 'Ohjelman loppu' ) ;

Tässä yllä olevassa koodissa:

  • Kolme funktiota on ilmoitettu tulostamaan 'Yksi', 'Kaksi' ja 'Kolme', ​​jokaisella funktiolla on takaisinsoittoparametri, joka mahdollistaa koodin peräkkäisen suorittamisen.
  • Aikakatkaisu asetetaan setTimeout-funktiolla, ja tietyn viiveen jälkeen tulostetaan console.log-käsky.
  • Kaksi viestiä tulostetaan 'Start of the Program' ja 'End of the Program', jotka osoittavat ohjelman alun ja lopun.
  • Ohjelma käynnistyy tulostamalla ”Start of the Program”, jonka jälkeen printOne-toiminto suoritetaan 1 sekunnin viiveellä, sitten printTwo-toiminto suoritetaan 2 sekunnin viiveellä ja lopuksi printThree-toiminto suoritetaan 3 sekunnin viiveellä. viive.
  • Ohjelma ei odota asynkronisen koodin suorituksia setTimeouts-funktioissa, jotka kirjaavat 'Ohjelman loppu' -käskyn ennen kuin tulostaa One, Two ja Three.

Lähtö

Suorita yllä oleva koodi suorittamalla tämä komento terminaalissa:

solmusovellus. js

Nyt terminaalin lähtö näkyisi asynkronisesti seuraavasti:

Nyt kun meillä on täydellinen käsitys synkronisesta ja asynkronisesta suorituksesta, siirrytään vahvistamaan tapahtumasilmukan käsitettä Node.js:ssä.

Node.js: Tapahtumasilmukkamekanismi

Sekä synkronisten että asynkronisten tehtävien suorittamista hallitsee Node.js:n tapahtumasilmukka. Suoritus käynnistyy heti, kun Node.js-projekti käynnistetään, ja se siirtää monimutkaiset tehtävät sujuvasti järjestelmään. Tämä varmistaa, että muut tehtävät voivat toimia sujuvasti pääsäikeessä.

Node.js:n tapahtumasilmukan visuaalinen selitys

Tapahtumasilmukka on jatkuva ja puoliksi ääretön Node.js:ssä. Tapahtumasilmukan käynnistää Node.js-koodikomentosarja, ja se vastaa asynkronisten API-kutsujen tekemisestä ja prosessien kutsumisesta.Tick() ja ajoitusajastimet jatkavat sitten tapahtumasilmukan suorittamista.

Node.js:ssä viisi päätyyppiä jonoa käsittelee takaisinkutsuja:

  • 'Timer Queue', joka tunnetaan yleisesti nimellä min-keap, on vastuussa 'setTimeout'- ja 'setInterval'-toimintoihin liittyvien takaisinsoittojen käsittelystä.
  • Asynkronisten toimintojen, kuten 'fs'- ja 'http'-moduulien takaisinkutsut käsitellään 'I/O-jonossa'.
  • 'Check Queue' sisältää takaisinkutsut 'setImmediate'-funktiolle, joka on ainutlaatuinen Node.
  • 'Sulje jono' hallitsee minkä tahansa asynkronisen tehtävän sulkemistapahtumaan liittyviä takaisinsoittoja.
  • Lopuksi 'Mikrotehtävä' -jonossa on kaksi erilaista jonoa:
    • 'NextTick'-jono sisältää 'process.nextTick'-funktioon liittyvät takaisinkutsut.
    • 'Promise'-jono hallitsee alkuperäiseen Promiseen liittyviä takaisinsoittoja.

Tapahtumasilmukkatoiminto Node.js:ssä

Tapahtumasilmukka toimii erityisten vaatimusten mukaisesti, jotka ohjaavat takaisinkutsun suoritusjärjestystä. Käyttäjän synkroninen Javascript-koodi annetaan etusijalle prosessin alussa, joten tapahtumasilmukka alkaa vasta, kun puhelupino tyhjennetään. Seuraava suoritusjärjestys noudattaa rakenteellista mallia:

Korkein prioriteetti annetaan takaisinkutsuille mikrotehtäväjonossa, jonka jälkeen siirrytään suorittamaan tehtävät nextTick-jonossa ja sen jälkeen Promise-jonossa olevat tehtävät. Sitten käsitellään ajastimen jonokutsujen prosessit, minkä jälkeen mikrotehtäväjonossa käydään uudelleen jokaisen ajastimen takaisinkutsun jälkeen. I/O-, tarkistus- ja sulkemisjonojen takaisinkutsut suoritetaan sitten samanlaisessa kaavassa mikrotehtäväjonon kanssa, jota käydään jokaisen vaiheen jälkeen.

Silmukka jatkaa suorittamista, jos käsiteltävänä on enemmän takaisinkutsuja. Kun koodiskripti on päättynyt tai takaisinkutsuja ei ole jäljellä käsitellä, tapahtumasilmukka päättyy tehokkaasti.

Nyt kun ymmärrämme syvällisesti tapahtumasilmukan, katsotaanpa sen ominaisuuksia.

Node.js:n tapahtumasilmukan ominaisuudet

Tärkeimmät ominaisuudet ovat:

  • Tapahtumasilmukka on ääretön silmukka ja jatkaa tehtävien suorittamista heti kun se vastaanottaa ne ja siirtyy lepotilaan, jos tehtäviä ei ole, mutta alkaa toimia heti, kun tehtävä on vastaanotettu.
  • Tapahtumajonon tehtävät suoritetaan vain, kun pino on tyhjä, mikä tarkoittaa, että aktiivista toimintoa ei ole.
  • Takaisinsoittoja ja lupauksia voidaan käyttää tapahtumasilmukassa.
  • Koska tapahtumasilmukka noudattaa Abstract-tietotyyppijonon periaatetta, se suorittaa ensimmäisen tehtävän ja jatkaa sitten seuraavaan.

Tapahtumasilmukan sekä asynkronisten ja synkronisten suoritusten logiikan perusteellisen ymmärtämisen jälkeen eri vaiheiden ymmärtäminen voi vahvistaa tapahtumasilmukan käsitteitä.

Node.js Tapahtumasilmukan vaiheet

Kuten edellä mainittiin, tapahtumasilmukka on puoliksi ääretön. Siinä on useita vaiheita, mutta joitain vaiheita käytetään sisäiseen käsittelyyn. Näillä vaiheilla ei ole vaikutusta koodiskriptiin.

Tapahtumasilmukka seuraa Queuen toiminnallisuutta ja suorittaa tehtävän ensin sisään ja ensin ulos periaatteella. Käyttöjärjestelmä käsittelee ajoitetut ajastimet, kunnes ne vanhenevat. Vanhentuneet ajastimet lisätään sitten ajastimien takaisinsoittojonoon.

Tapahtumasilmukka suorittaa ajastimen jonossa olevat tehtävät yksitellen, kunnes tehtäviä ei ole enää jäljellä tai se saavuttaa suurimman sallitun tehtävien määrän. Alla olevissa osioissa selitetään tapahtumasilmukoiden ydinvaiheet.

Ajastinvaihe

Node.js:ssä on ajastinsovellusliittymä, joka voi ajoittaa toiminnot, jotka suoritetaan tulevaisuudessa. Kun varattu aika on kulunut, ajastimen takaisinsoitto suoritetaan heti, kun ne voidaan ajoittaa; viive voi kuitenkin kohdata joko käyttöjärjestelmän päästä tai johtuen muiden takaisinkutsujen suorittamisesta.

Ajastinsovellusliittymällä on kolme päätoimintoa:

  • setTimeout
  • aseta Välitön
  • setInterval

Yllä mainitut toiminnot ovat synkronisia. Tapahtumasilmukan ajastinvaiheen laajuus on rajoitettu setTimeout- ja setInterval-toimintoihin. Kun tarkistustoiminto käsittelee setImmediate-toimintoa.

Tarkastellaan yksinkertaista esimerkkiä teoreettisen osan vahvistamiseksi:

// application.js

toiminto viivästetty Toiminto ( ) {

konsoli. Hirsi ( 'viivästetty toiminto suoritetaan aikakatkaisun jälkeen' ) ;

}

konsoli. Hirsi ( 'Ohjelman alku' ) ;

setTimeout ( viivästetty toiminto, 2000 ) ;

konsoli. Hirsi ( 'Ohjelman loppu' ) ;

Tässä koodissa:

  • Ohjelma käynnistyy kirjaamalla terminaaliin käsky 'Ohjelman aloitus'.
  • Sitten delayedFunction kutsutaan 2 ms:n ajastimella, koodiskripti ei pysähdy ja jatkaa viiveen käsittelyä taustalla.
  • Lausunto 'Ohjelman päättyminen kirjataan lokiin ensimmäisen lausekkeen jälkeen.
  • 2 ms:n viiveen jälkeen delayedFunctionin käsky kirjataan päätteelle.

Lähtö

Tulos näkyy seuraavasti:

Voidaan nähdä, että koodia ei pysäytetä delayedFunctionin käsittelyä varten; se siirtyy eteenpäin ja viiveen jälkeen funktion takaisinkutsu käsitellään.

Odottavat takaisinsoitot

Tapahtumasilmukka tarkistaa kyselyvaiheessa tapahtuvat tapahtumat, kuten tiedostojen lukemisen, verkkotoiminnot tai syöttö-/tulostustehtävät. On tärkeää tietää, että Node.js:ssä vain osa tapahtumista käsitellään tässä äänestysvaiheessa. Tapahtumasilmukan myöhemmässä iteraatiossa tietyt tapahtumat voidaan kuitenkin siirtää odottavaan vaiheeseen. Tämä on keskeinen käsite, joka on pidettävä mielessä optimoitaessa ja vianmäärityksessä Node.js-koodia, joka sisältää monimutkaisia ​​tapahtumaohjattuja toimintoja.

On tärkeää ymmärtää, että odottavien takaisinsoittojen aikana tapahtumasilmukka lisää lykätyt tapahtumat odottavien takaisinsoittojen jonoon ja suorittaa ne. Tämä vaihe käsittelee myös joitain järjestelmän luomia TCP-socket-virheitä, kuten ECONNREFUSED-virhetapahtumia tietyissä käyttöjärjestelmissä.

Alla mainitaan esimerkki konseptin vahvistamiseksi:

// application.js
konst fs = vaatia ( 'fs' ) ;
toiminto readFileAsync ( filePath, takaisinsoitto ) {
fs. lue tiedosto ( './PromiseText.txt' , 'utf8' , toiminto ( virhe, dataa ) {
jos ( err ) {
konsoli. virhe ( ` Virhe tiedoston lukeminen : $ { err. viesti } ` ) ;
} muu {
konsoli. Hirsi ( ` Tiedosto sisältö : $ { tiedot } ` ) ;
}
soita takaisin ( ) ;
} ) ;
}
konsoli. Hirsi ( 'Ohjelman alku' ) ;
readFileAsync ( './PromiseText.txt' , toiminto ( ) {
konsoli. Hirsi ( 'Tiedosto luettu takaisinsoitto suoritettu' ) ;
} ) ;
konsoli. Hirsi ( 'Ohjelman loppu' ) ;

Tässä koodissa:

  • Ohjelma käynnistetään kirjaamalla päätelaitteeseen käsky 'Ohjelman aloitus'.
  • ReadFileAsync on määritetty asynkronisesti lukemaan tiedoston 'PromiseText.txt' sisältö. Se on parametroitu toiminto, joka suorittaa takaisinsoittotoiminnon tiedoston lukemisen jälkeen.
  • ReadFileAsync-toimintoa kutsutaan käynnistämään tiedoston lukuprosessi.
  • Ohjelma ei pysähdy tiedoston lukemisen aikana; Sen sijaan se siirtyy seuraavaan käskyyn ja kirjaa sen terminaaliin 'Ohjelman loppu'.
  • Tiedoston lukemisen asynkroninen tapahtuma käsitellään taustalla tapahtumasilmukalla.
  • Kun tiedosto on luettu asynkronisesti ja sisältö on kirjattu päätelaitteelle, ohjelma kirjaa tiedoston sisällön päätelaitteelle. Sen jälkeen se kirjaa seuraavan viestin 'Tiedosto luettu takaisinsoitto suoritettu'.
  • Tapahtumasilmukka käsittelee odottavat takaisinsoittotoiminnot seuraavassa vaiheessa.

Lähtö

Yllä olevan suorituksen tulos on:

Idle, valmistele vaihe Node.js:ssa

Idle-vaihetta käytetään Node.js:n sisäisten toimintojen käsittelemiseen, joten se ei ole vakiovaihe. Se ei vaikuta koodikirjoitukseen. Idle-vaihe on kuin taukojakso tapahtumasilmukalle, jonka aikana hallitsee taustalla olevia matalan prioriteetin tehtäviä. Yksinkertainen esimerkki tämän vaiheen ymmärtämiseksi on:

konst { tyhjäkäynnillä } = vaatia ( 'idle-gc' ) ;

tyhjäkäynnillä. jättää huomiotta ( ) ;

Tässä koodissa käytetään 'idle-gc' -moduulia, joka sallii joutovaiheen huomioimisen. Tämä auttaa käsittelemään tilanteita, joissa tapahtumasilmukka on varattu eikä taustatehtäviä suoriteta. Idle.ignore-tiedoston käyttöä ei pidetä optimaalisena, koska se voi aiheuttaa suorituskykyongelmia.

Pollausvaihe Node.js:ssä

Node.js:n kyselyvaihe toimii seuraavasti:

  • Se käsittelee kyselyjonon tapahtumia ja suorittaa niitä vastaavat tehtävät.
  • Se päättää, kuinka paljon aikaa kuluu odottamiseen ja I/O-toimintojen tarkistamiseen prosessissa.

Kun tapahtumasilmukka siirtyy kyselyvaiheeseen ajastimen puuttumisen vuoksi, suoritetaan yksi seuraavista tehtävistä:

  • Node.js:n tapahtumasilmukan kyselyvaiheessa odottavat I/O-tapahtumat asetetaan jonoon ja suoritetaan sitten järjestyksessä First In ja First Out -periaatteen mukaisesti, kunnes jono tyhjenee. Takaisinkutsujen suoritusten aikana nextTick- ja microtasks-jonot ovat myös toiminnassa. Tämä varmistaa sujuvuuden ja mahdollistaa I/O-toimintojen tehokkaamman ja luotettavamman käsittelyn.
  • Jos jono on tyhjä ja komentosarjaa ei ole ajoitettu setImmediate()-funktiolla, tapahtumasilmukka päättyy ja se jatkaa seuraavaan vaiheeseen (check). Toisaalta, jos komentosarjan ajoituksen on tehnyt setImmediate()-funktio, tapahtumasilmukka sallii takaisinkutsujen lisäämisen jonoon, jonka se suorittaa.

Tämä havainnollistetaan parhaiten yksinkertaisella koodiesimerkillä:

setTimeout ( ( ) => {

konsoli. Hirsi ( 'Asynkronointi suoritettu' ) ;

} , 2000 ) ;

konsoli. Hirsi ( 'Alkaa' ) ;

aseta Välitön ( ( ) => {

konsoli. Hirsi ( 'setImmediate callback executed' ) ;

} ) ;

konsoli. Hirsi ( 'loppu' ) ;

Tässä koodissa:

  • Kaksi viestiä 'Start' ja 'End' osoittavat ohjelman alkamisen ja lopettamisen.
  • Funktio setTimeout() asettaa takaisinsoittotoiminnon 2 ms:n viiveellä ja kirjaa terminaaliin 'Async-toiminto suoritettu'.
  • Funktio setImmediate() kirjaa 'setImmediate callback executed' -viestin päätelaitteelle sen jälkeen, kun Start-viesti on kirjattu päätteeseen.

Lähtö

Tulos näyttää viestit vain minuutin havainnon perusteella, että 'Async-toiminto suoritettu' vie aikaa ja tulostetaan 'Lopeta'-viestin jälkeen:

Node.js-tarkistusvaihe

Kun kyselyvaihe on suoritettu, suoritetaan takaisinkutsut tarkistusvaiheessa. Jos koodiskripti ajoitetaan käyttämällä setImmediate()-funktiota ja kyselytoiminto on vapaa, tapahtumasilmukka toimii siirtymällä suoraan tarkistusvaiheeseen sen sijaan, että se pysyisi käyttämättömänä. SetImmediate()-funktio on ainutlaatuinen ajastin, joka toimii tapahtumasilmukan eri vaiheissa.

Libuv API:ta käytetään takaisinkutsujen suoritusten suunnitteluun kyselyvaiheen suorittamisen jälkeen. Koodin suorittamisen aikana tapahtumasilmukka siirtyy kyselyvaiheeseen, jossa se odottaa saapuvia yhteyspyyntöjä. Toisessa tapauksessa, jos takaisinsoitto on ajoitettu käyttämällä setImmediate()-funktiota ja kyselyvaihe päättyy ilman toimintaa, se siirtyy tarkistusvaiheeseen odottamisen sijaan. Harkitse alla olevaa esimerkkiä ymmärtääksesi:

// application.js

konsoli. Hirsi ( 'Alkaa' ) ;

aseta Välitön ( ( ) => {

konsoli. Hirsi ( 'Välitön takaisinsoitto' ) ;

} ) ;

konsoli. Hirsi ( 'loppu' ) ;

Tässä koodissa kolme viestiä kirjataan päätteeseen. Sen jälkeen setImmediate()-funktio lähettää lopulta takaisinsoittopyynnön kirjatakseen viestin ' Välitön takaisinsoitto ” terminaaliin.

Lähtö

Yllä olevan koodin tulos näkyy seuraavassa järjestyksessä:

Node.js sulje takaisinkutsut

Node.js käyttää tätä sulkemisvaihetta takaisinkutsujen suorittamiseen tapahtumien sulkemiseksi ja tapahtumasilmukan iteroinnin lopettamiseksi. Kun yhteys on suljettu, tapahtumasilmukka käsittelee sulkemistapahtumat tässä vaiheessa. Tässä tapahtumasilmukan vaiheessa 'nextTick()' ja mikrotehtävät luodaan ja käsitellään samalla tavalla kuin muissakin vaiheissa.

Process.exit-funktiota käytetään tapahtumasilmukan lopettamiseen milloin tahansa. Tapahtumasilmukka jättää huomioimatta kaikki odottavat asynkroniset toiminnot ja Node.js-prosessi päättyy.

Yksinkertainen esimerkki harkittavaksi on:

// application.js
konst netto = vaatia ( 'netto' ) ;
konst palvelin = netto. createServer ( ( pistorasia ) => {
pistorasia. päällä ( 'kiinni' , ( ) => {
konsoli. Hirsi ( 'Pistoke kiinni' ) ;
} ) ;
pistorasia. päällä ( 'data' , ( tiedot ) => {
konsoli. Hirsi ( 'Vastaanotetut tiedot:' , dataa. toString ( ) ) ;
} ) ;
} ) ;
palvelin. päällä ( 'kiinni' , ( ) => {
konsoli. Hirsi ( 'Palvelin suljettu' ) ;
} ) ;
konst portti = 3000 ;
palvelin. kuunnella ( satama, ( ) => {
konsoli. Hirsi ( `Palvelin kuuntelee portissa $ { portti } ` ) ;
} ) ;
setTimeout ( ( ) => {
konsoli. Hirsi ( 'Palvelin suljetaan 10 sekunnin kuluttua' ) ;
palvelin. kiinni ( ) ;
käsitellä asiaa. poistu ( ) ;
} , 10 000 ) ;

Tässä koodissa:

  • ' const net = vaatia('net') ' tuo TCP-palvelimen käsittelemiseen tarvittavan verkkomoduulin ja ' const server = net.createServer((socket) => { ” luo uuden TCP-palvelinesiintymän.
  • ' socket.on('sulje', () => {… } ” kuuntelee ”sulkea” kaikista liitännöistä. Kun pistorasiayhteys suljetaan, terminaaliin kirjataan viesti Socket Closed.
  • ' socket.on('data', (data) => {} ” tarkistaa saapuvat tiedot kaikista yksittäisistä pistorasioista ja tulostaa ne '.toString()'-funktiolla.
  • ' server.on('sulje', () => {…} ” tarkistaa ”sulje”-tapahtuman itse palvelimelta ja kun palvelinyhteys suljetaan, se kirjaa ”Palvelin suljettu” -viestin päätelaitteelle.
  • ' server.listen(port, () => {…} ” kuuntelee portin saapuvia yhteyksiä.
  • ' setTimeout(() => {…} ” asettaa 10 ms:n ajastimen palvelimen sulkemiseen.

Tämä päättää keskustelun Node.js:n tapahtumasilmukan eri vaiheista. Ennen kuin hyppäämme johtopäätökseen, keskustelemme viimeisestä asiasta, eli kuinka poistua Node.js:n tapahtumasilmukasta.

Node.js:n tapahtumasilmukasta poistuminen

Tapahtumasilmukka on suoritusvaiheessa niin kauan kuin kaikissa tapahtumasilmukan vaiheiden jonoissa on tehtäviä. Tapahtumasilmukka päättyy poistumisvaiheen lähettämisen jälkeen ja poistumiskuuntelijan takaisinsoitto palaa, jos jonoissa ei ole enää tehtäviä.

Yksinomainen tapa lopettaa tapahtumasilmukka on käyttää '.exit'-menetelmää. Node.js:n aktiiviset prosessit päättyvät välittömästi, kun process.exit-funktio kutsutaan. Kaikki ajoitetut ja odottavat tapahtumat jätetään pois:

käsitellä asiaa. päällä ( 'poistu' , ( koodi ) => {

konsoli. Hirsi ( `Poistutaan poistumiskoodilla : $ { koodi } ` ) ;

} ) ;

käsitellä asiaa. poistu ( 1 ) ;

Käyttäjät voivat kuunnella .exit-toimintoa. On huomattava, että '.exit'-funktion on oltava synkroninen, koska Node.js-ohjelma poistuu heti, kun se kuuntelee tätä tapahtumaa.

Tämä päättää keskustelun tapahtumasilmukasta. Syvällinen artikkeli, joka on käsitellyt kaikki tapahtumasilmukaan liittyvät käsitteet, vaiheet ja esimerkit.

Johtopäätös

Ennen kuin ymmärrät tapahtumasilmukan, yleiskatsaus synkronisista ja asynkronisista käsitteistä voi auttaa ymmärtämään tapahtumasilmukan koodikulkua. Synkroninen suoritus tarkoittaa vaiheittaista suoritusta, kun taas asynkroninen suoritus tarkoittaa joidenkin vaiheiden pysäyttämistä odottamatta niiden valmistumista. Artikkelissa käsitellään tapahtumasilmukan toimintaa ja kaikkia vaiheita sekä sopivia esimerkkejä.