Sinchroninio ir asinchroninio „JavaScript“ - 1 dalies supratimas
Sinchroninis ir asinchroninis klaidinančios „JavaScript“ sąvokos, ypač pradedantiesiems. Yra du ar daugiau dalykų sinchroniškai kai jie atsitinka tuo pačiu metu (sinchronizuoti), ir asinchroninis, kai jie to nedaro (ne sinchronizuojama).
Nors šiuos apibrėžimus lengva priimti, tai iš tikrųjų yra sudėtingesnė nei atrodo. Turime atsižvelgti į tai kas tiksliai yra sinchronizuojama, ir kas ne.
Tikriausiai skambinate a normalus
funkcija „JavaScript“ sinchroninėje sistemoje, ar ne? Ir jei tai kažkas panašaus setTimeout ()
arba AJAX, su kuriuo dirbate, tai vadinsite asinchroniniu, taip? Ką daryti, jei aš tai sakau abu yra asinchroninis?
Paaiškinti kodėl, mums reikia kreiptis į X p.
1 scenarijus - X bando sinchroniškumą
Štai sąranka:
- X yra tas, kuris gali atsakyti į sunkius klausimus ir atlikti bet kokią prašomą užduotį.
- Vienintelis būdas susisiekti su juo yra telefonu.
- Nepriklausomai nuo klausimo ar užduoties, kad galėtumėte paprašyti X p. jūs jį vadinate.
- X suteiks jums atsakymą arba užpildo užduotį tuoj pat, ir leidžia jums žinoti padaryta.
- Jūs nustumiate imtuvo jausmą ir išeinate į filmą.
Tai, ką ką tik atlikote, buvo a sinchroninis (pirmyn ir atgal) ryšys Su X. Jis išklausė, kaip jūs paklausėte jo klausimo, ir jūs klausėte, kai jis atsakė.
2 scenarijus - X nėra patenkintas sinchroniškumu
Kadangi X yra toks veiksmingas, jis pradeda gauti daug daugiau skambučių. Taigi, kas atsitinka, kai jį vadinate, bet jis jau užimtas kalbėti su kitu? Jūs negalėsite paklausti jo klausimo - ne tol, kol jis galės laisvai gauti jūsų skambutį. Viskas, ką girdėsite, yra užimtas tonas.
Taigi, ką X gali padaryti kovodama su šia problema?
Vietoj skambučių tiesiogiai:
- Ponas X pasamdo naują vaikiną, p. M ir suteikia jam skambinančiojo atsakiklį palikti pranešimus.
- M. M užduotis perduoti pranešimą nuo atsakiklio iki X, kai jis žino, kad X visiškai baigė visus ankstesnius pranešimus ir jau yra laisvai priimti naują.
- Taigi dabar, kai jį skambinate, užuot užimtas užimtas tonas, tuomet jūs paliekate pranešimą X p laukti, kol jis paskambins jums atgal (dar nėra filmo laiko).
- Kai X bus padaryta su visomis eilėmis, kurias jis gavo prieš jūsų, jis išnagrinės jūsų problemą ir paskambinkite jums atgal atsakyti.
Dabar čia yra klausimas: ar iki šiol buvo imtasi veiksmų sinchroninis arba asinchroninis?
Tai sumaišyta. Kai palikote žinutę, J. X to neklausė, todėl ketvirtasis bendravimas buvo asinchroninis.
Bet, kai jis atsakė, tu ten klausai, kuris grąžina ryšį sinchroniškai.
Tikiuosi, kad dabar jūs įgyjate geresnį supratimą apie tai, kaip sinchroniškumas suvokiamas bendravimo požiūriu. Laikas įkelti „JavaScript“.
„JavaScript“ - asinchroninė programavimo kalba
Kai kas nors žymi „JavaScript asynchronous“, tai, ką jie nurodo apskritai, yra tai, kaip galite palik žinutę už tai, ir neužblokuotas jūsų skambutis su užimtu tonu.
Funkcijos skambina niekada nesiekite „JavaScript“, jie tiesiog padaryta per pranešimus.
„JavaScript“ naudoja a pranešimo eilė kur yra laikomi gaunami pranešimai (ar įvykiai). An įvykių kilpa (pranešimo dispečeris) nuosekliai siunčia šiuos pranešimus a skambučių kamino kur atitinkamos pranešimų funkcijos sukrauti kaip rėmeliai (funkcijų argumentai ir kintamieji).
Skambučių kaminai priklauso pradinės funkcijos, kuriai skambinama, rėmelis ir bet kokie kiti funkcijų pavadinimai per įvestus skambučius ant jo .
Kai pranešimas prisijungia prie eilės, jis laukia, kol bus skambinama tuščias iš visų ankstesnio pranešimo rėmelių, ir kai tai yra, renginio ciklas dequeues ankstesnį pranešimą, ir prideda atitinkamus dabartinio pranešimo rėmelius į skambučių kaminą.
Pranešimas vėl laukia, kol tampa skambučių kamino tuščias savo atitinkamus rėmus (t. y. visų sukrautų funkcijų vykdymas pasibaigė), tada yra deformuojamas.
Apsvarstykite šį kodą:
funkcija foo () funkcijų juosta () foo (); funkcija baz () bar (); baz ();
Vykdoma funkcija baz ()
(paskutinėje kodo fragmento eilutėje) prie eilės pridedamas pranešimas, ir kai įvykio kilpa jį pasiima, skambučio kamino pradeda krauti rėmelius dėl baz ()
, baras ()
, ir foo ()
atitinkamuose vykdymo punktuose.
Kai funkcijų vykdymas bus baigtas po vieną, jų rėmeliai yra pašalintas iš skambučių kamino, kai pranešimas yra vis dar laukia eilėje, iki baz ()
yra iškeliamas iš kamino.
Atminkite, kad funkcijos yra niekada nesiekite „JavaScript“, jie padaryti per pranešimus. Taigi, kai išgirsite ką nors, kad „JavaScript“ yra asinchroninė programavimo kalba, daroma prielaida, kad jie kalba apie savo integruotą “atsakymų mašina”, ir kaip galite laisvai palikti žinutes.
Bet kaip apie konkrečius asinchroninius metodus?
Iki šiol aš nepalikau API, pvz setTimeout ()
ir AJAX, tai yra tos, kurios yra vadinamas asinchroniniu. Kodėl taip?
Svarbu suprasti, kas yra sinchroninis ar asinchroninis. „JavaScript“, naudojant įvykius ir renginio liniją, gali praktikuoti asinchroninis pranešimų apdorojimas, bet tai nereiškia viskas „JavaScript“ yra asinchroninis.
Atminkite, kad pasakiau jums, kad pranešimas nepaliko, kol nebuvo skambučių kamino tuščias jo atitinkamus rėmelius, kaip jūs nepalikote filmui, kol gausite atsakymą - tai yra būti sinchroniškai, jūs laukiate kol užduotis bus baigta, ir gausite atsakymą.
Laukiama nėra idealus visuose scenarijuose. Ką daryti, jei po pranešimo, o ne laukti, galite palikti filmą? Ką daryti, jei funkcija gali išeiti į pensiją (skambinimo kamino ištuštinimas), o jo pranešimas gali būti ištrintas dar prieš baigiant funkciją? Ką daryti, jei jūs galite turėti kodą, atliktą asinchroniškai?
Tai yra API, pvz setTimeout ()
ir AJAX ateina į paveikslėlį, ir tai, ką jie daro, yra… laikykite, negaliu to paaiškinti be grįžimo į X, kurį matysime antroje šio straipsnio dalyje. Būkite sureguliuoti.