Kako deluje zanka dogodkov v JavaScript?

Čeprav bo za pisanje celotne proizvodne kode treba uporabljati poglobljeno razumevanje jezikov, kot sta C ++ in C, je JavaScript pogosto mogoče napisati le z osnovnim razumevanjem, kaj je mogoče storiti z jezikom.


Pojmovanja, kot je prenašanje povratnih klicev v funkcije ali pisanje asinhrone kode, pogosto ni tako težko izvesti, zaradi česar večina razvijalcev JavaScript manj skrbi, kaj se dogaja pod pokrovom. Ne zanima jih razumevanje zahtevnosti, ki jih je jezik močno odvzel.

Kot razvijalec JavaScript postaja vse bolj pomembno, da razumemo, kaj se v resnici dogaja pod pokrovom in kako večina teh kompleksnosti, odvzetih od nas, resnično deluje. Pomaga nam pri sprejemanju bolj informiranih odločitev, kar lahko posledično drastično poveča našo kodo.

Ta članek se osredotoča na enega zelo pomembnih, a redko razumljivih konceptov ali izrazov v JavaScript. The PRIKAZ DOGODKA!. 

Pisanju asinhrone kode v JavaScript ne moremo preprečiti, ampak zakaj koda, ki deluje asinhrono, resnično pomeni? t.j.. Zanka zanke

Preden lahko razumemo, kako deluje zanka dogodkov, moramo najprej razumeti, kaj je sam JavaScript in kako deluje!

Kaj je JavaScript?

Preden nadaljujemo, bi želeli, da storimo korak nazaj k samim osnovam. Kaj je v resnici JavaScript? JavaScript bi lahko opredelili kot;

JavaScript je visok, interpretiran, enojni navoj, ki ne blokira, asinhroni, sočasni jezik.

Čakaj, kaj je to? Knjižna definicija? ��

Razčistimo ga!

Ključne besede v tem članku so enojni navoj, neblokira, sočasno, in asinhrono.

Enojna nit

Niz izvedbe je najmanjše zaporedje programiranega navodila, ki ga lahko neodvisno upravlja planer. Programski jezik je enojni, kar pomeni, da lahko hkrati opravlja samo eno nalogo ali operacijo. To pomeni, da bi izvedel celoten postopek od začetka do konca, ne da bi se nit prekinila ali ustavila.

Za razliko od jezikov z več nitmi, pri katerih se lahko več procesov izvaja v več nitih hkrati, ne da bi se blokirali.

Kako lahko JavaScript z enim navojem in ne blokira ob istem času?

Toda kaj pomeni blokada?

Neblokiranje

Ni ene definicije blokiranja; to preprosto pomeni stvari, ki počasi tečejo po niti. Torej ne blokiranje pomeni stvari, ki niso prepočasne.

Toda počakaj, sem rekel, da JavaScript deluje na eni niti? In sem tudi rekel, da ne blokira, kar pomeni, da se naloga hitro izvaja na paketu klicev? Ampak kako??? Kaj pa, ko zaženemo timerje? Zank?

Sprostite se! Ugotovili bomo malo ��.

Sočasno

Sočasnost pomeni, da se koda hkrati izvaja več kot ena nit.

Ok, stvari postajajo resnično čudno zdaj, kako je mogoče JavaScript imeti enojno nit in biti istočasno? to pomeni, da svojo kodo izvrši z več kot eno nitjo?

Asinhrono

Asinhrono programiranje pomeni, da se koda izvaja v zanki dogodkov. Ko pride do blokade, se dogodek začne. Blokirna koda še naprej deluje brez blokiranja glavne izvedbene niti. Ko se blokirna koda konča, se iz vrst blokirnih operacij uvrsti v vrsto in jih potisne nazaj v sklad.

Toda JavaScript ima eno samo nit? Kaj nato izvrši to blokirno kodo, medtem ko dovoli, da se druge kode v nitki izvršijo?

Preden nadaljujemo, si povzamemo zgornjo.

  • JavaScript je enojni
  • JavaScript ne blokira, tj. Počasni procesi ne blokirajo njegove izvedbe
  • JavaScript je sočasen, to pomeni, da hkrati izvrši svojo kodo v več kot eni niti
  • JavaScript je asinhroni, tj. Blokira kodo nekje drugje.

Vendar zgoraj navedeno ne pomeni natančno, kako je mogoče z enim navojem jezik neblokirati, sočasno in asinhroni?

Pojdimo malo globlje, pojdimo do JavaScript izvajalnih motorjev, V8, morda ima nekaj skritih niti, ki jih ne poznamo.

Motor V8

Motor V8 je visokozmogljiv, odprtokodni sistem izvajanja spletnega sestavljanja za JavaScript, ki ga je na C ++ napisal Google. Večina brskalnikov poganja JavaScript s pomočjo motorja V8, tudi priljubljeno okolje za izvajanje vozlišč vozlišč ga uporablja.

V preprosti angleščini je V8 program C ++, ki prejme kodo JavaScript, jo pripravi in ​​izvede.

V8 počne dve glavni stvari;

  • Dodelitev pomnilnika v velikem obsegu
  • Kontekst izvedbe sklada klicev

Na žalost je bil naš sum napačen. V8 ima samo en klic, pomislite na niz klicev kot nit.

Ena nit === en sklad klicev === ena izvedba hkrati.

Slika – Hacker Noon

Ker ima V8 samo en sklad klicev, kako se JavaScript izvaja hkrati in asinhrono, ne da bi blokiral glavno izvedbeno nit?

Poskusimo to ugotoviti tako, da napišemo preprosto, a hkrati skupno asinhrono kodo in jo skupaj analiziramo.

JavaScript vodi vsako kodno vrstico, eno za drugo (enojno). Po pričakovanjih se prva vrstica tiska v konzoli, toda zakaj je zadnja vrstica natisnjena pred kodo časovne omejitve? Zakaj postopek izvršitve ne počaka na časovno omejitev kode (blokiranje), preden nadaljujemo z začetkom zadnje vrstice?

Zdi se nam, da nam je neka druga nit pomagala pri izvedbi tega časa, saj smo prepričani, da lahko nit izvrši samo eno samo nalogo v katerem koli trenutku.

Pokukajmo v to Izvorna koda V8 za nekaj časa.

Počakaj, kaj??!!! V V8 ni nobenih funkcij časovnika, ni DOM-a? Ni dogodkov? Ne AJAX?…. Yeeeeessss!!!

Dogodki, DOM, timerji itd. Niso del osnovne implementacije JavaScripta, JavaScript je natančno skladen s specifikacijami Ecma Scripts in različne različice so pogosto omenjene v skladu s specifikacijami skripta Ecma (ES X).

Izvedbeni potek dela

Dogodki, merilniki časa, zahteve Ajax so na strani odjemalca na voljo v brskalnikih in jih pogosto imenujemo spletni API. Oni so tisti, ki omogočajo, da enoprostorski JavaScript ne blokira, sočasno in asinhroni! Ampak kako?

V delovni tok izvajanja katerega koli programa JavaScript so trije glavni odseki, sklad klicev, spletni API in čakalna vrsta opravil.

Klic klicev

Kopček je podatkovna struktura, v kateri je zadnji, ki je bil dodan zadnji element, vedno prvi, ki je bil odstranjen iz sklada. Lahko bi si ga zamislili kot kup plošče, v kateri je mogoče najprej odstraniti samo prvo ploščo, ki je bila zadnja dodana. Klic stojnic preprosto ni nič drugega kot struktura podatkovnega sklada, kjer se naloge ali koda ustrezno izvajajo.

Poglejmo spodnji primer;

Vir – https://youtu.be/8aGhZQkoFbQ

Ko pokličete funkcijo printSquare (), jo potisnete na klicni klic, funkcija printSquare () pokliče funkcijo square (). Kvadratna () funkcija se potisne na zlaganje in pokliče tudi funkcijo množenja (). Funkcija pomnoževanja se potisne na kup. Ker se funkcija množenja vrne in je zadnja stvar, ki je bila potisnjena v sklad, se najprej razreši in se odstrani iz sklada, sledi funkcija kvadrat () in nato funkcija printSquare ().

Spletni API

Tu se izvaja koda, ki je ne upravlja motor V8, da ne “blokira” glavne izvedbene niti. Ko klic stojnice naleti na funkcijo spletnega API-ja, se postopek takoj preda spletnemu API-ju, kjer se izvaja in sprosti klic klicev, da med njegovo izvedbo izvajajo druge operacije.

Vrnimo se na zgornji primer setTimeout;

Ko zaženemo kodo, se prva vrstica console.log potisne v sklad in skoraj takoj poiščemo svoj izhod. Ko pridemo do časovne omejitve, časovniki upravljajo brskalnik in niso del osrednje implementacije V8. namesto tega v spletni API sprostite sklad, da lahko izvaja druge operacije.

Medtem ko časovna omejitev še vedno teče, se sklad nadaljuje na naslednjo vrstico dejanja in zažene zadnjo console.log, kar razloži, zakaj smo to dobili pred izhodom časovnika. Ko je časovnik končan, se nekaj zgodi. Konzola.log v tem časovniku se čarobno ponovno pojavi v klicu!

Kako?

Zanka zanke

Preden razpravljamo o zanki dogodkov, pojdimo najprej skozi funkcijo čakalne vrste.

Nazaj na primer časovne omejitve, ko Web API konča izvajanje naloge, ga ne bo samodejno vrnil nazaj v klic klicev. To gre na Čakalna vrsta opravil. 

Čakalna vrsta je podatkovna struktura, ki deluje po načelu First in First out, tako da se naloge potisnejo v čakalno vrsto, se izpustijo v istem vrstnem redu. Naloge, ki so jih izvedli spletni API-ji, ki jih potisnemo v čakalno vrsto opravil, nato se vrnite nazaj v klic klicev, če želite izpisati rezultat.

Ampak počakaj. KAJ HECK JE ZGODBA DOGODKA???

Vir – https://youtu.be/8aGhZQkoFbQ

Zanka dogodka je postopek, ki čaka, da se sveženj klicev izbriše, preden potisne povratne klice iz čakalne vrstice v sklad klicev. Ko je Stack jasen, se zanka dogodka sproži in preveri v opravilni vrsti razpoložljivih povratnih klicev. Če jih je, ga potisne v klic klicev, počaka, da se stak klica ponovno zbriše, in ponovi isti postopek.

Vir – https://www.quora.com/How-does-an-event-loop-work/answer/Timothy-Maxwell

Zgornji diagram prikazuje osnovni potek dela med zanko dogodkov in čakalno vrsto opravil.

Zaključek

Čeprav je to zelo osnovni uvod, koncept asinhronega programiranja v JavaScriptu daje dovolj vpogleda, da lahko jasno razumemo, kaj se dogaja pod pokrovom in kako se lahko JavaScript poganja sočasno in asinhrono s samo enim navojem.

JavaScript je vedno na zahtevo, in če se želite učiti, bi vam svetoval, da to preverite Seveda Udemy.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map