Pochopenie synchrónneho a asynchrónneho jazyka JavaScript - časť 1
synchrónne a asynchrónne sú mätúce pojmy v jazyku JavaScript, najmä pre začiatočníkov. Dve alebo viac vecí sú synchrónne keď oni súčasne (v synchronizácii) a asynchrónne, ak nie (nie je v synchronizácii).
Hoci sú tieto definície jednoduché, je to skutočne zložitejšie, ako vyzerá. Musíme to vziať do úvahy čo presne sú v synchronizácii, a čo nie.
Pravdepodobne by ste zavolali a normálne
funkcie v synchrónnom jazyku JavaScript, nie? A ak je to niečo podobné setTimeout ()
alebo AJAX, s ktorými pracujete, budete na ne odkazovať ako na asynchrónne, áno? Čo keď vám to poviem oba sú asynchrónne?
Vysvetliť prečo, musíme sa obrátiť na pána X za pomoc.
Scenár 1 - Pán X sa pokúša synchronicitu
Tu je nastavenie:
- Pán X je niekto, kto môže odpovedať na ťažké otázky a vykonávať akúkoľvek požadovanú úlohu.
- Jediný spôsob, ako ho kontaktovať, je prostredníctvom telefonátu.
- Nech už máte akúkoľvek otázku alebo úlohu, aby ste sa mohli spýtať pomoc pána X, aby ho vykonali; voláš ho.
- Pán X vám dáva odpoveď alebo dokončí úlohu hneď, a dáva vám vedieť hotovo.
- Zložil ste prijímač pocit spokojnosti a ísť von za film.
To, čo ste práve vykonali, bolo synchronizáciu (tam a späť) s pánom X. Počúval, ako ste sa ho pýtali na vašu otázku, a vy ste počúvali, keď odpovedal.
Scenár 2 - Pán X nie je spokojný so synchronicitou
Keďže pán X je tak efektívny, začne prijímať ďalšie hovory. Takže čo sa stane, keď ho voláš, ale už je zaneprázdnený hovoriť s niekým iným? Nebudete sa ho môcť opýtať na tvoju otázku - až kým nebude môcť dostať tvoju výzvu. Všetko, čo počujete, je rušný tón.
Takže to, čo môže urobiť pán X, aby to bojovalo?
Namiesto telefonovania priamo:
- Pán X si najal nového pána M a dáva mu záznamník pre volajúcich nechať správy.
- Úlohou pána M je odovzdať správu od záznamníka k pánovi X, keď vie, že pán X úplne dokončil spracovanie všetkých predchádzajúcich správ a už je zadarmo vziať nový.
- Takže teraz, keď ho zavoláte, namiesto toho, aby ste dostali zaneprázdnený tón, môžete nechať správu pre pána X počkajte, kým vás zavolá späť (ešte žiadny filmový čas).
- Akonáhle bude pán X hotový so všetkými frontálnymi správami, ktoré dostal pred tvojim, bude sa zaoberať tvojím problémom a zavolám ti späť aby vám dala odpoveď.
Teraz tu leží otázka: boli doterajšie akcie synchrónne alebo asynchrónne?
Je to zmiešané. Keď ste opustili správu, Pán X to neposlúchol, takže čakacia komunikácia bola asynchrónna.
Ale keď odpovedal, bol si tam počúvaný, ktorý robí návratovú komunikáciu synchronnou.
Dúfam, že ste získali lepšie pochopenie toho, ako sa synchronicita vníma z hľadiska komunikácie. Čas zarobiť JavaScript.
JavaScript - asynchrónny programovací jazyk
Keď niekto označuje JavaScript za asynchrónny, to, čo sa týka všeobecne, je to, ako môžete zanechajte správu pre to, a nemáte blokovaný hovor s obsadeným tónom.
Funkcie hovoru sú nikdy priamo do jazyka JavaScript, sú doslova hotové cez správy.
JavaScript používa a frontu správ kde sa nachádzajú prichádzajúce správy (alebo udalosti). udalosť slučka (dispečer správ) postupne odosiela tieto správy na adresu a zásobník hovorov kde sú zodpovedajúce funkcie správ stohované ako rámčeky (funkčné argumenty a premenné) na vykonanie.
Hromada hovorov obsahuje rámec počiatočnej funkcie, ktorá sa volá, a akékoľvek ďalšie rámce pre volané funkcie prostredníctvom vnorených hovorov na vrchole .
Keď sa správa pripojí k frontu, čaká, až kým nebude zásobník hovorov prázdne zo všetkých snímok z predchádzajúcej správy, a ak je, udalosť-slučka znehodnocuje predchádzajúcu správu, a pridá príslušné rámce aktuálnej správy do zásobníka hovorov.
Správa opäť čaká, kým sa zásobník hovorov nestane prázdne z vlastných zodpovedajúcich rámcov (to znamená, že popravy všetkých naskladaných funkcií prebiehajú), potom sa zruší.
Zoberme si nasledujúci kód:
funkcia foo () funkčná lišta () foo (); funkcia baz () bar (); baz ();
Spúšťaná funkcia je baz ()
(na poslednom riadku útržku kódu), pre ktoré do frontu sa pridá správa, a keď ju udalosť-slučka vyberie, zásobník hovorov spustí stohovanie rámcov pre baz ()
, bar ()
, a foo ()
na príslušných miestach vykonania.
Po vykonaní funkcií je jeden po druhom, ich rámce sú odstránené zo zásobníka hovorov, zatiaľ čo správa je stále čaká vo fronte, kým baz ()
sa vyskočí z balíka.
Pamätajte si, že volania funkcie sú nikdy priamo do jazyka JavaScript, sú hotové cez správy. Takže vždy, keď počujete, že niekto povie, že samotný JavaScript je asynchrónny programovací jazyk, predpokladajme, že hovorí o jeho zabudovanom “odkazovač”, a ako môžete slobodne ponechať správy.
Ale čo špecifické asynchrónne metódy?
Doteraz som sa nedotkol API ako napr setTimeout ()
a AJAX, to sú tie, ktoré sú konkrétne označované ako asynchrónne. Prečo to je?
Je dôležité pochopiť, čo presne je synchrónne alebo asynchrónne. JavaScript, s pomocou udalostí a cyklus udalostí, môže trénovať asynchrónne spracovanie správ, ale to to neznamená všetko v jazyku JavaScript je asynchrónny.
Pamätajte, povedal som vám, že správa neopustila, kým nebol zásobník hovorov prázdne z príslušných rámcov, rovnako ako ste neopustili na film, kým nedostanete odpoveď - to je sú synchrónne, tam čakáte kým úloha nie je dokončená, a dostanete odpoveď.
čakania nie je ideálny vo všetkých scenároch. Čo keď po opustení správy namiesto čakania môžete odísť do filmu? Čo ak môže funkcia odstúpiť (vyprázdnenie zásobníka hovorov) a jeho správa sa môže zrušiť ešte pred dokončením úlohy funkcie? Čo ak môžete kód spustiť asynchrónne?
Tu sa nachádzajú API ako napr setTimeout ()
a AJAX prichádzajú do obrazu a to, čo robia, je ... držte sa, nemôžem to vysvetliť bez toho, aby som sa vrátil k pánovi X, čo uvidíme v druhej časti tohto článku. Zostaňte naladení.