Synkronisen ja asynkronisen JavaScriptin ymmärtäminen - Osa 1
Synkroninen ja asynkroninen ovat sekoittavia käsitteitä JavaScriptissä, erityisesti aloittelijoille. Kaksi tai useampia asioita synkroninen kun he tapahtuu samanaikaisesti (synkronoinnissa) ja asynkroninen, kun he eivät (ei synkronoitu).
Vaikka nämä määritelmät on helppo ottaa käyttöön, se on itse asiassa monimutkaisempi kuin näyttää. Meidän on otettava huomioon mitä tarkalleen synkronoidaan, ja mikä ei ole.
Soitat todennäköisesti a normaali
toimii JavaScript-synkronissa, eikö? Ja jos se on jotain setTimeout ()
tai AJAX, jonka kanssa työskentelet, viittaat siihen asynkronisena, kyllä? Entä jos kerron teille sen molemmat ovat asynkronisia tavalla?
Selittää miksi, meidän on käännyttävä X: n puoleen apua varten.
Skenaario 1 - X yrittää synkronisuutta
Tässä on asennus:
- Herra X on joku, joka voi vastata vaikeisiin kysymyksiin ja suorittaa kaikki pyydetyt tehtävät.
- Ainoa tapa ottaa häneen yhteyttä on puhelun kautta.
- Riippumatta kysymyksestä tai tehtävästä, jotta voit kysyä X: n apua sen toteuttamisessa; soitat hänelle.
- X antaa sinulle vastauksen tai suorittaa tehtävän heti, ja voit tietää se on tehty.
- Voit asettaa vastaanottimen tuntemaan sisällön ja mennä ulos elokuvasta.
Se mitä olet juuri tehnyt, oli a synkroninen (edestakaisin) viestintä Hän kuunteli, kun kysyit häneltä kysymyksesi, ja kuuntelit, kun hän vastasi siihen.
Skenaario 2 - X ei ole tyytyväinen synkronisuuteen
Koska X on niin tehokas, hän alkaa vastaanottaa paljon enemmän puheluja. Joten mitä tapahtuu, kun soitat hänelle mutta hän on jo kiireinen puhuuko jonkun toisen kanssa? Et voi kysyä häneltä kysymyksesi - ei, ennen kuin hän saa vapaasti puhelun. Kuulet vain kiireisen äänen.
Mitä siis herra X voi tehdä tämän torjumiseksi?
Sen sijaan, että ottaisit puheluja suoraan:
- Herra X palkkaa uuden miehen, herra M: n ja antaa hänelle vastaajaa soittajille jättää viestejä.
- M: n tehtävänä on välittää viestin vastaajasta X: lle, kun hän tietää, että X on lopettanut kaikkien aiempien viestien käsittelyn ja on jo vapaasti ottaa uuden.
- Joten nyt, kun soitat hänelle, sen sijaan, että saisit kiireisen äänen, saat viestin herra X: lle odota, että hän soittaa sinulle takaisin (ei vielä elokuvan aikaa).
- Kun herra X on tehnyt kaikki jonotetut viestit, jotka hän on saanut ennen sinun, hän tutkii ongelmasi ja soitan takaisin antaa sinulle vastauksen.
Nyt tässä on kysymys: olivatko toimet tähän mennessä synkroninen tai asynkroninen?
Se on sekava. Kun jätit viestin, Herra X ei kuunnellut sitä, joten neljäs viestintä oli asynkroninen.
Mutta kun hän vastasi, olit siellä kuuntelemassa, joka tekee paluuyhteyden synkronoiduksi.
Toivon nyt, että olet ymmärtänyt paremmin, miten synkronisuus nähdään viestinnän kannalta. Aika tuoda JavaScript.
JavaScript - asynkroninen ohjelmointikieli
Kun joku merkitsee JavaScriptin asynkronisen, se, mitä he viittaavat yleensä, on, miten voit Jätä viesti sen puolesta, ja ei ole estetty ja varattu sävy.
Toimintopuhelut ovat koskaan suorita JavaScript-sovellusta, ne ovat kirjaimellisesti tehty viestien kautta.
JavaScript käyttää a viestijono missä saapuvat viestit (tai tapahtumat) pidetään. tapahtuma-silmukka (viestin lähetin) lähettää nämä viestit peräkkäin a kutsupino jossa viestien vastaavat toiminnot ovat pinottu kehyksiksi (toiminnon väitteet ja muuttujat).
Puhelunippu pitää kutsutun alkutoiminnon kehyksen ja kaikki muut kehykset kehotetuille toiminnoille puhelujen kautta Sen päällä .
Kun viesti liittyy jonoon, se odottaa, kunnes puhelunippu on tyhjä kaikista edellisen viestin kehyksistä, ja kun se on, tapahtuma-silmukka purkaa edellisen viestin, ja lisää nykyisen viestin vastaavat kehykset puhelunippuun.
Viesti odottaa uudelleen, kunnes puhelunippu tulee tyhjennä omia vastaavia kehyksiä (ts. kaikkien pinottujen toimintojen suorittaminen on ohi), sitten se puretaan.
Harkitse seuraavaa koodia:
toiminto foo () toimintopalkki () foo (); toiminto baz () bar (); baz ();
Suorittava toiminto on baz ()
(koodinpätkän viimeisellä rivillä), jolle jonoon lisätään viesti, ja kun tapahtuma-silmukka poimii sen, puhelun pino alkaa pinota kehyksiä varten baz ()
, baari()
, ja foo ()
asianmukaisissa täytäntöönpanopisteissä.
Kun toimintojen suorittaminen on suoritettu yksitellen, niiden kehykset ovat poistettu puhelun pinosta, kun viesti on odottaa vielä jonossa, siihen asti kun baz ()
ponnahtaa pinosta.
Muista, että funktiopuhelut ovat koskaan suorita JavaScript-sovellusta, he ovat tehneet viestien kautta. Joten kun kuulet jonkun sanovan, että JavaScript itse on asynkroninen ohjelmointikieli, oletetaan, että he puhuvat sisäänrakennetusta “vastauskone”, ja miten voit vapaasti jättää viestejä.
Mutta entä tietyt asynkroniset menetelmät?
Tähän mennessä en ole koskettanut API: ta, kuten setTimeout ()
ja AJAX, ne ovat ne, jotka ovat kutsutaan nimenomaan asynkroniseksi. Miksi niin?
On tärkeää ymmärtää, mitä on synkroninen tai asynkroninen. JavaScript voi tapahtumien ja tapahtumakierron avulla harjoitella viestien asynkroninen käsittely, Mutta se ei tarkoita kaikki JavaScriptissä on asynkroninen.
Muista, että sanoin, että viesti ei jätä, ennen kuin puhelunippu oli tyhjät sen vastaavista kehyksistä, aivan kuten et lähtenyt elokuvaan ennen kuin saat vastauksesi - se on on synkroninen, olet siellä odottamassa kunnes tehtävä on valmis, ja saat vastauksen.
odotus ei ole ihanteellinen kaikissa skenaarioissa. Mitä jos viestin jättämisen jälkeen voit odottaa, voit jättää elokuvaan? Entä jos toiminto voi jäädä pois (puhelunipun tyhjentäminen), ja sen viesti voidaan purkaa jopa ennen kuin tehtävä on suoritettu? Entä jos voit suorittaa koodin asynkronisesti?
Tässä on API: t, kuten setTimeout ()
ja AJAX tulevat kuvaan, ja mitä he tekevät on… pidä kiinni, en voi selittää tätä ilman, että palaan herra X: ään, jota näemme tämän artikkelin toisessa osassa. Pysy kanavalla.