Sünkroonse ja asünkroonse JavaScript - 1. osa mõistmine
Sünkroonne ja asünkroonne on segadust tekitavad mõisted JavaScriptis, eriti algajatele. Kaks või enam asja on sünkroonne kui nad on juhtuda samal ajal (sünkroonis) ja asünkroonne, kui nad seda ei tee (pole sünkroonis).
Kuigi need määratlused on kergesti kasutatavad, on see tegelikult keerulisem. Me peame arvestama mis täpselt on sünkroonis, ja mis mitte.
Tõenäoliselt helistate a-le normaalne
funktsiooni JavaScript sünkroonis, eks? Ja kui see on midagi sellist setTimeout ()
või AJAX, millega te töötate, viite sellele asünkroonseks, jah? Mis siis, kui ma ütlen teile seda mõlemad on asünkroonsed?
Selle selgitamiseks miks, peame abi saamiseks pöörduma hr X poole.
1. stsenaarium - hr X püüab sünkroonsust
Siin on häälestus:
- Hr X on keegi, kes suudab vastata karmidele küsimustele ja täita mis tahes nõutud ülesandeid.
- Ainus viis temaga ühendust võtta on telefonikõne kaudu.
- Mis iganes küsimus või ülesanne on, et küsida hr Xi abi selle elluviimiseks; sa helistad talle.
- Hr X annab teile vastuse või täidab selle kohe, ja saate teada see on tehtud.
- Sa paned vastuvõtja tundma sisu ja lähete filmi juurde.
See, mida sa just tegid, oli a sünkroonne (edasi-tagasi) side härra X-ga. Ta kuulas, kui te küsisite temalt oma küsimust ja kuulasite, kui ta seda vastas.
2. stsenaarium - hr X ei ole rahul sünkroonilisusega
Kuna hr X on nii tõhus, hakkab ta palju rohkem kõnesid vastu võtma. Mis juhtub siis, kui sa teda helistad ta on juba hõivatud keegi teine rääkis? Te ei saa temalt küsida - mitte enne, kui ta saab oma kõne vastu võtta. Kõik, mida kuulete, on hõivatud toon.
Mida saab hr X selle vastu võidelda?
Otseste kõnede tegemise asemel:
- Mr X palkab uue poisi, härra M ja annab talle helistajale automaatvastaja sõnumitest lahkuda.
- Härra M ülesanne on edastama sõnumi X-lt, kui ta teab, et hr X on lõpetanud kõigi eelmiste sõnumite töötlemise ja on juba vabalt võtta uus.
- Nii et nüüd kui sa teda helistad, siis saad hoopis hõivatud tooni asemel härra X-le sõnumi oota, et ta teile tagasi helistab (pole veel filmi aega).
- Kui härra X on teinud kõik sinu poolt vastuvõetud sõnumid, siis vaatab ta teie probleemi ja helistan sulle tagasi anda teile vastus.
Nüüd on siin küsimus: kas tegu on seni sünkroonne või asünkroonne?
See on segane. Kui lahkusite oma sõnumist, Mr X ei kuulanud seda, nii et neljas kommunikatsioon oli asünkroonne.
Aga kui ta vastas, sa olid seal kuulates, mis muudab tagasiside sünkrooniks.
Ma loodan, et olete nüüdseks omandanud parema arusaama sellest, kuidas sünkroonikat suhtluses tajutakse. Aeg JavaScripti tuua.
JavaScript - asünkroonne programmeerimiskeel
Kui keegi sildistab JavaScripti asünkroonse, siis mida nad üldiselt viitavad, on see, kuidas saate Jäta sõnum selle eest ja ei ole teie kõne blokeeritud hõivatud tooniga.
Funktsioonikõned on kunagi suunata JavaScripti, nad on sõna otseses mõttes tehtud sõnumite kaudu.
JavaScript kasutab a sõnumi järjekorda kus saabuvad sõnumid (või sündmused). An sündmus-silmus (sõnumi dispetšer) saadab need sõnumid järjestikku kõne kus sõnumite vastavad funktsioonid on kaadritena (funktsiooni argumendid ja muutujad).
Kõne stäkk omab algse funktsiooni raami, mida kutsutakse, ja muid funktsioone, mida kutsutakse sisestatud kõnede kaudu selle peale .
Kui sõnum liidab järjekorraga, ootab see, kuni kõne on tühjendage eelmise sõnumi kõik kaadrid, ja kui see on, siis sündmuskohal dequeues eelmise sõnumi, ja lisab kõnepostile praeguse sõnumi vastavad kaadrid.
Sõnum ootab uuesti, kuni kõne korstnaks muutub tühi oma vastavatest raamidest (s.t kõikide stackitud funktsioonide hukkamised on möödas), siis deformeeritakse.
Vaadake järgmist koodi:
funktsioon foo () funktsiooniriba () foo (); funktsioon baz () bar (); baz ();
Käivitatav funktsioon on baz ()
(koodilõigu viimases reas), mille jaoks järjekorda lisatakse sõnum, ja kui sündmusahela see üles võtab, siis kõne korstnat alustab raamide virnastamist jaoks baz ()
, baar ()
, ja foo ()
asjakohastes täitmispunktides.
Kui funktsioonide täitmine on ükshaaval lõpetatud, on nende raamid eemaldatud kõne stäkist, kui sõnum on ootab veel järjekorda, kuni baz ()
on hüppeliselt pinu.
Pea meeles, et funktsioonikõned on kunagi suunata JavaScripti, nad on valmis sõnumite kaudu. Nii et kui kuulete kedagi, kes ütleb, et JavaScript ise on asünkroonne programmeerimiskeel, eeldage, et nad räägivad selle sisseehitatud “automaatvastaja”, ja kuidas saate sõnumeid vabaks jätta.
Aga konkreetsed asünkroonsed meetodid?
Siiani ei ole ma API-sid puudutanud setTimeout ()
ja AJAX, need on need, mis on nimetatakse spetsiifiliselt asünkrooniks. Miks nii?
Oluline on mõista, mis on sünkroonne või asünkroonne. JavaScript võib sündmuste ja sündmuskohaga abiks olla sõnumite asünkroonne töötlemine, aga see ei tähenda kõike JavaScriptis on asünkroonne.
Pea meeles, et ma ütlesin teile, et sõnum ei lahkunud enne, kui kõne korstnat oli tühjaks oma vastavatest raamidest, just nagu sa ei jätnud filmi, kuni sa ei saa vastust - see on olles sünkroonne, sa oled seal ootamas kuni ülesanne on lõppenud, ja sa saad vastuse.
Ootan ei ole ideaalne kõikides stsenaariumides. Mis siis, kui pärast sõnumi lahkumist võite oodata filmi asemel lahkuda? Mis siis, kui funktsioon saab pensionile jääda (kõne korstna tühjendamine), ja selle sõnumit saab deformeerida isegi enne, kui funktsiooni ülesanne on lõppenud? Mis siis, kui teil on võimalik koodi asünkrooniliselt käivitada?
See on koht, kus APId, näiteks setTimeout ()
ja AJAX tulevad pildile ja see, mida nad teevad, on… kinni, ma ei saa seda seletada ilma X-le tagasi pöördumata, mida me näeme käesoleva artikli teises osas. Hoidke häälestatud.