Domovská » Kódování » Pochopení synchronního a asynchronního JavaScriptu - část 1

    Pochopení synchronního a asynchronního JavaScriptu - část 1

    Synchronní a asynchronní jsou matoucí koncepty v JavaScriptu, zejména pro začátečníky. Dvě nebo více věcí synchronní kdy oni současně (synchronizovaně) a asynchronní, když ne (není synchronizováno).

    Ačkoli tyto definice jsou snadno přijatelné, to je vlastně více komplikované než to vypadá. Musíme to vzít v úvahu co přesně jsou synchronizovány, a co ne.

    Asi bys zavolal normální funkce v JavaScriptu synchronní, že? A jestli je to něco jako setTimeout () nebo AJAX, se kterým pracujete, budete na něj odkazovat jako na asynchronní, ano? Co když vám to řeknu oba způsobem asynchronní?

    Vysvětlit proč, musíme se obrátit na pana X o pomoc.

    Scénář 1 - Pan X se pokouší o synchronizaci

    Zde je nastavení:

    1. Pan X je někdo, kdo dokáže odpovědět na těžké otázky a provést jakýkoliv požadovaný úkol.
    2. Jediný způsob, jak ho kontaktovat, je telefonát.
    3. Ať už máte jakoukoliv otázku nebo úkol, abyste mohli požádat pana X o pomoc při jeho provádění; zavoláš mu.
    4. Pan X vám dá odpověď nebo úkol dokončí rovnou, a umožní vám to vědět je to hotovo.
    5. Odložíte přijímač, který se cítí spokojený a půjdete na film.

    To, co jste právě provedli, bylo synchronní (zpětná a zpětná) komunikace s panem X. Naslouchal, jak jste se ho ptali na vaši otázku, a vy jste naslouchali, když na to odpovídal.

    Scénář 2 - Pan X není spokojen se synchronicitou

    Vzhledem k tomu, že pan X je tak účinný, začíná přijímat mnohem více hovorů. Co se stane, když mu zavoláte, ale už je zaneprázdněn mluvit s někým jiným? Nebudete se ho moci zeptat na svou otázku - ne dokud nebude moci přijmout vaše volání. Jediné, co uslyšíte, je obsazovací tón.

    Co tedy může pan X udělat, aby proti tomu bojoval?

    Místo přímého volání:

    1. Pan X najímá nového chlapa, pana M a dá mu záznamník pro volající zprávy.
    2. Úkolem pana M je předat zprávu z záznamníku na pana X, jakmile ví, že pan X dokončil zpracování všech předchozích zpráv a je již zdarma.
    3. Takže teď, když mu zavoláte, místo toho, abyste dostali obsazovací tón, pak necháte vzkaz pro pana X počkejte, až vám zavolá zpět (zatím žádný čas filmu).
    4. Jakmile je pan X proveden se všemi zprávami ve frontě, které obdržel před vámi, podívá se do vašeho problému a zavolej zpět abych vám odpověděl.

    Tady leží otázka: byly akce dosud synchronní nebo asynchronní?

    Je to smíšené. Když jste zanechali zprávu, Pan X na to neposlouchal, takže čtvrtá komunikace byla asynchronní.

    Ale když odpověděl, vy jste tam poslouchali, který umožňuje synchronizaci zpětné komunikace.

    Doufám, že jste nyní získali lepší pochopení toho, jak je synchronicita vnímána z hlediska komunikace. Čas přivést JavaScript.

    JavaScript - Asynchronní programovací jazyk

    Když někdo označí asynchronní jazyk JavaScript, na co obecně odkazují, je to, jak můžete zanechat vzkaz za to, a hovor není blokován s obsazovacím tónem.

    Funkce volání jsou nikdy přímo v JavaScriptu, jsou doslova hotové prostřednictvím zpráv.

    JavaScript používá fronty zpráv kde jsou příchozí zprávy (nebo události) uchovávány. An event-loop (dispečer zpráv) postupně odesílá tyto zprávy do a volání zásobníku kde jsou odpovídající funkce zpráv skládané jako rámce (funkce arguements & proměnné) pro provedení.

    Zásobník volání obsahuje rámec počáteční funkce, která je volána, a všechny další rámce pro funkce, které se volají přes vnořené hovory nahoře .

    Když se zpráva připojí k frontě, čeká, dokud není zásobník volání prázdných všech snímků z předchozí zprávy, a když je, smyčka události zruší předchozí zprávu, a přidá odpovídající rámce aktuální zprávy do zásobníku volání.

    Zpráva čeká znovu, dokud se zásobník volání nestane prázdných vlastních odpovídajících rámců (tj. provedení všech stohovaných funkcí je ukončeno), pak je dekomprimováno.

    Zvažte následující kód:

     function foo ()  funkce bar () foo ();  funkce baz () bar ();  baz (); 

    Spuštěná funkce je baz () (v posledním řádku fragmentu kódu), pro který zpráva je přidána do fronty, a když to smyčka událostí zvedne, zásobník volání začíná skládání snímků pro baz (), bar(), a foo () v příslušných prováděcích bodech.

    Jakmile jsou jednotlivé funkce dokončeny jeden po druhém, jejich rámce jsou odstraněny ze zásobníku volání, zprávy stále čeká ve frontě, dokud baz () je vyskakován ze zásobníku.

    Nezapomeňte, že funkce volání jsou nikdy přímo v JavaScriptu, jsou hotové prostřednictvím zpráv. Takže když uslyšíte, že někdo říká, že JavaScript je asynchronní programovací jazyk, předpokládejte, že mluví o jeho vestavěném “záznamník”, a jak si můžete nechat zprávy.

    Ale co specifické asynchronní metody?

    Zatím jsem se nedotkl API, jako je setTimeout () a AJAX, to jsou ty, které jsou specificky označované jako asynchronní. Proč je to tak?

    Je důležité pochopit, co přesně je synchronní nebo asynchronní. JavaScript, s pomocí událostí a event-loop, může praktikovat asynchronní zpracování zpráv, ale to to neznamená všechno v JavaScriptu je asynchronní.

    Pamatuješ, říkala jsem ti, že zpráva neopustila, dokud nebyl hovor bez odpovídajících rámců, stejně jako jste neodcházeli do filmu, dokud nedostanete odpověď - to je být synchronní, čekáš až do dokončení úkolu, a dostanete odpověď.

    Čekání není ideální ve všech scénářích. Co když po zanechání zprávy, místo čekání, můžete odejít do filmu? Co když funkce může odejít do důchodu (vyprázdnění zásobníku hovorů) a jeho zpráva může být odstraněna ještě před dokončením úlohy funkce? Co když můžete mít kód spuštěn asynchronně?

    Toto je kde APIs takový jak setTimeout () AJAX přicházejí do obrazu a to, co dělají, je… držet se, nemohu to vysvětlit, aniž bych se vrátil k panu X, což uvidíme v druhé části tohoto článku. Zůstaňte naladěni.