Početna » šifriranje » Razumijevanje sinkronog i asinkronog JavaScripta - 1. dio

    Razumijevanje sinkronog i asinkronog JavaScripta - 1. dio

    Sinkroni i asinhron su zbunjujući koncepti u JavaScriptu, posebno za početnike. Dvije ili više stvari su sinkroni kada oni dogoditi u isto vrijeme (u sinkronizaciji) i asinkroni kada ne (nije sinkronizirano).

    Iako je ove definicije lako prihvatiti, zapravo je kompliciranije nego što izgleda. Moramo uzeti u obzir što je točno sinkronizirano, i što nije.

    Vjerojatno biste nazvali normalan funkcija u JavaScriptu sinkronizirana, zar ne? A ako je nešto slično setTimeout () ili AJAX s kojim radite, nazvat ćete ga asinkronim, zar ne? Što ako vam to kažem oba na neki način su asinkroni?

    Objasniti zašto, trebamo se obratiti gospodinu X-u za pomoć.

    Scenarij 1 - g. X pokušava sinkronicitet

    Ovo je postava:

    1. Gospodin X je netko tko može odgovoriti na teška pitanja i izvršiti bilo koji zadani zadatak.
    2. Jedini način da ga kontaktirate je telefonski poziv.
    3. Kakvo god pitanje ili zadatak ste dobili, kako biste od gospodina Xa zatražili pomoć da ga izvede; nazovi ga.
    4. Gospodin X vam daje odgovor ili dovršava zadatak odmah, i obavještava vas o tome gotovo je.
    5. Spuštate slušalicu i osjećate se zadovoljnima i izlazite u kino.

    Ono što ste upravo izveli je sinkrona (povratna i naprijed) komunikacija S g. X. Slušao je dok ste mu postavljali pitanje, i slušali ste ga kad je odgovarao.

    Scenarij 2 - g. X nije zadovoljan sinkronicitetom

    Budući da je g. X tako učinkovit, on prima više poziva. Pa što se događa kad ga nazoveš, ali već je zauzet razgovarate s nekim drugim? Nećete mu moći postaviti pitanje - ne dok ne bude slobodan primiti vaš poziv. Sve što ćete čuti je ton zauzetosti.

    Dakle, što može učiniti g. X u borbi protiv toga?

    Umjesto izravnog uzimanja poziva:

    1. Gospodin X unajmljuje novog momka, g. M i daje mu telefonsku sekretaricu za pozivatelje ostaviti poruke.
    2. Posao gospodina M. je da proslijedite poruku od telefonske sekretarice do g. Xa kad sazna da je g. X potpuno završio obradu svih prethodnih poruka i već je slobodno uzeti novi.
    3. Sada kad ga nazovete, umjesto da dobijete ton zauzetosti, onda možete ostaviti poruku za g. Xa čekaj da te nazove (još nema vremena za film).
    4. Kada gospodin X završi sa svim porukama koje je primio u redu čekanja, on će istražiti vaš problem, i nazvat ću te dati vam odgovor.

    Sada ovdje leži pitanje: jesu li dosad djelovali sinkroni ili asinkroni?

    Miješano je. Kada ostavite poruku, Gospodin X nije ga slušao, tako da je četvrta komunikacija bila asinkrona.

    Ali kad je odgovorio, bili ste tamo i slušali, koji čini komunikaciju povratka sinkronom.

    Nadam se da ste do sada stekli bolje razumijevanje o tome kako se shvaća sinkronicitet u smislu komunikacije. Vrijeme je da unesete JavaScript.

    JavaScript - Asinkroni programski jezik

    Kada netko označi JavaScript asinkrono, ono na što se odnosi općenito je kako možete ostavite poruku za to, i Vaš poziv nije blokiran tonom zauzeća.

    Pozivi funkcije su nikada ne usmjerite JavaScript, oni su doslovno gotovi putem poruka.

    JavaScript koristi a red poruka gdje se održavaju dolazne poruke (ili događaji). događaj petlje (poruka dispečera) sekvencijalno šalje te poruke u stog poziva gdje su odgovarajuće funkcije poruka složeni kao okviri (funkcija i varijable funkcije) za izvršenje.

    Stack poziva drži okvir početne funkcije koja se zove, i bilo koje druge okvire za funkcije koje se zovu putem ugniježđenih poziva na vrhu .

    Kada se poruka pridruži redu čekanja, čekat će se dok stog poziva praznih svih okvira iz prethodne poruke, i kada je, događaj-petlja oduzima prethodnu poruku, i dodaje odgovarajuće okvire trenutne poruke u stog poziva.

    Poruka čeka ponovno dok stog poziva ne postane praznih svojih odgovarajućih okvira (tj. izvršenja svih složenih funkcija su gotova), zatim se ukida.

    Razmotrite sljedeći kôd:

     funkcija foo ()  traka s funkcijama () foo ();  funkcija baz () bar ();  baz (); 

    Funkcija koja se izvodi je baz () (u posljednjem retku isječka koda), za što poruka se dodaje u red čekanja, i kada je događaj-petlja pokupi, stog poziva počinje slagati okvire za baz (), bar(), i foo () na mjestima izvršenja.

    Kada je izvršavanje funkcija završeno jedan po jedan, njihovi su okviri uklonjen iz skupa poziva, dok je poruka još uvijek čekaju u redu, do baz () iskače iz hrpe.

    Zapamtite, pozivi funkcija su nikada ne usmjerite JavaScript, gotovi su putem poruka. Dakle, kad god čujete da netko kaže da je sam JavaScript asinkroni programski jezik, pretpostavite da oni govore o njegovom ugrađenom “telefonska sekretarica”, i kako možete slobodno ostavljati poruke.

    Ali što je sa specifičnim asinkronim metodama?

    Do sada nisam dotaknuo API-je kao što je setTimeout () i AJAX, to su one koje jesu posebno označen kao asinkroni. Zašto je to?

    Važno je razumjeti što je točno sinkrono ili asinkrono. JavaScript, uz pomoć događaja i događaja, može prakticirati asinkrona obrada poruka, ali to ne znači sve u JavaScriptu je asinkrono.

    Zapamtite, rekao sam vam da poruka ne napušta dok stog ne bude praznih okvira, baš kao što niste otišli u film dok ne dobijete odgovor - to je biti sinkroni, čekate dok se zadatak ne dovrši, i dobijete odgovor.

    čekanje nije idealan u svim scenarijima. Što ako nakon napuštanja poruke, umjesto čekanja, možete otići u film? Što ako se funkcija može povući (pražnjenje stog poziva), a njezina se poruka može izbrisati čak i prije nego što se zadatak funkcije dovrši? Što ako asinkrono možete izvršiti kod?

    Ovdje API-ji poput setTimeout () i AJAX dolaze na sliku, a ono što oni rade je ... sačekajte, ne mogu ovo objasniti bez povratka na g. X, što ćemo vidjeti u drugom dijelu ovog članka. Ostanite s nama.