A szinkron és aszinkron JavaScript megértése - 1. rész
egyidejű és aszinkron zavaró fogalmak a JavaScript-ben, különösen a kezdők számára. Két vagy több dolog van egyidejű amikor ők egyszerre történik (szinkronban), és aszinkron, ha nem (nem szinkronban).
Bár ezek a definíciók könnyen bevihetők, valójában bonyolultabb, mint amilyennek látszik. Figyelembe kell vennünk pontosan mi van szinkronban, és mi nem.
Valószínűleg a Normál
funkció a JavaScript szinkronban, ugye? És ha valami ilyesmi setTimeout ()
vagy AJAX, amellyel együtt dolgozol, akkor aszinkronnak tekintjük, igen? Mi van, ha ezt mondom mindkét aszinkron módon vannak?
A magyarázatot miért, X segítségért fordulnunk kell.
1. forgatókönyv - X úr szinkronitást próbál
Íme a beállítás:
- X úr valaki, aki nehéz kérdésekre válaszolhat, és elvégezheti a kért feladatokat.
- Az egyetlen módja annak, hogy kapcsolatba léphessen vele telefonhíváson keresztül.
- Bármilyen kérdés vagy feladat is van, annak érdekében, hogy megkérje X úr segítségét annak végrehajtásához; hívod.
- X megadja a választ vagy befejezi a feladatot azonnal, és tudod kész.
- Leteszed a vevő érzés tartalmát, és megy ki egy filmet.
Amit most csináltál, egy szinkron kommunikáció meghallgatta, amikor megkérdezte tőle a kérdést, és hallgatta, amikor válaszolt rá.
2. forgatókönyv - X nem elégedett a szinkronizmussal
Mivel X annyira hatékony, elkezd több hívást fogadni. Szóval mi történik, ha hívod, de már elfoglalt beszél valakivel? Nem fogja tudni megkérdezni a kérdést - nem egészen addig, amíg meg nem kapja a hívását. Minden, amit hallani fog, elfoglalt hang.
Tehát mit tehet X úr a küzdelem érdekében?
Ahelyett, hogy hívásokat kezdeményezne:
- X úr egy új srácot vesz fel, Mr. M, és ad neki egy üzenetrögzítőt a hívók számára üzeneteket hagyni.
- M feladata küldjön egy üzenetet az üzenetrögzítőtől X-hez, amikor tudja, hogy X úr teljesen befejezte az összes korábbi üzenet feldolgozását, és máris megtörtént szabadon vehet egy újat.
- Tehát most, amikor felhívja őt, ahelyett, hogy elfoglalt hangot kapna, akkor üzenetet hagyhat X úrnak várjon, hogy visszahívjon (még nincs filmidő).
- Miután X úr az összes sorba állított üzenettel az Ön előtt érkezett, meg fogja vizsgálni a problémát, és visszahívlak válaszol.
Most itt van a kérdés: az eddigi cselekedetek szinkron vagy aszinkron?
Vegyes. Amikor elhagyta az üzenetet, X nem hallgatta meg, így a negyedik kommunikáció aszinkron volt.
De amikor válaszolt, hallgattál, melyik a visszatérő kommunikációt szinkronban teszi.
Remélem, hogy most már jobban megértetted, hogy a szinkronitás hogyan érzékelhető a kommunikáció szempontjából. Ideje behozni a JavaScript-et.
JavaScript - aszinkron programozási nyelv
Amikor valaki címkézést ad a JavaScript aszinkronnak, akkor általában mit jelentenek hagyjon üzenetet számára, és a hívását nem blokkolta elfoglalt hangjelzéssel.
A függvényhívások soha ne irányítsa a JavaScript-et, szó szerint megtették üzeneteken keresztül.
A JavaScript a üzenetsor a bejövő üzenetek (vagy események) megtartása. egy esemény-loop (egy üzenet-diszpécser) ezeket az üzeneteket egymás után elküldi a hívási lista ahol az üzenetek megfelelő funkciói vannak keretként halmozott (függvényérvek és változók) a végrehajtáshoz.
A hívásköteg a meghívott kezdeti függvény keretét és a hívott funkciók bármely más keretét tartja beágyazott hívásokon keresztül a tetején .
Amikor egy üzenet csatlakozik a várakozási sorhoz, addig vár, amíg a hívás verem meg nem jelenik az előző üzenet összes képének üres, és mikor, az esemény-hurok dequeues az előző üzenetet, és hozzáadja az aktuális üzenet megfelelő képkockáit a hívási veremhez.
Az üzenet ismét vár, amíg a hívás verem meg nem jelenik üres a saját megfelelő kereteiről (azaz az összes halmozott függvény végrehajtása véget ért), majd dequeued.
Fontolja meg a következő kódot:
foo () funkciósáv () foo (); funkció baz () bar (); baz ();
A futtatható függvény BAZ ()
(a kódrészlet utolsó sorában), amelyre egy üzenet kerül a sorba, és amikor az esemény-hurok felveszi azt, a hívás verem elkezdi a kereteket egymásra rakni mert BAZ ()
, bár()
, és ize ()
a megfelelő végrehajtási pontokon.
Miután a funkciók végrehajtása egyenként befejeződött, a keretük eltávolították a híváskötegből, amíg az üzenet megérkezik még vár a sorban, amíg BAZ ()
ki van téve a veremből.
Ne feledje, hogy a funkcióhívások soha ne irányítsa a JavaScript-et, megtették üzeneteken keresztül. Tehát, ha valaki azt mondja, hogy a JavaScript maga aszinkron programozási nyelv, feltételezzük, hogy a beépítettről beszélnek “üzenetrögzítő”, és hogyan szabadon hagyhatja az üzeneteket.
De mi van a specifikus aszinkron módszerekkel?
Eddig nem értek meg olyan API-kat, mint például setTimeout ()
és AJAX, ezek azok, amelyek kifejezetten aszinkronnak nevezik. Miért van az, hogy?
Fontos megérteni, hogy pontosan mi szinkron vagy aszinkron. A JavaScript, az események és az esemény-hurok segítségével gyakorolható az üzenetek aszinkron feldolgozása, de ez nem jelenti azt minden a JavaScriptben aszinkron.
Ne feledje, hogy azt mondtam, hogy az üzenet nem ment el, amíg a hívásköteg nem volt üres a megfelelő keretekről, úgy, mintha nem hagyott volna egy filmet, amíg nem kapta meg a választ - ez az szinkron, ott vársz amíg a feladat befejeződik, és megkapod a választ.
Várakozás nem ideális minden forgatókönyvben. Mi van, ha az üzenet elhagyása után a várakozás helyett elhagyhatja a filmet? Mi van, ha egy függvény visszavonulhat (a hívásköteg kiürítése), és az üzenete még a funkció befejezése előtt is lehúzható? Mi van, ha a kódot aszinkron módon hajtja végre?
Ez az az API, ahol például az setTimeout ()
és az AJAX jön a képbe, és amit csinálnak,… tartsák be, ezt nem tudom megmagyarázni anélkül, hogy visszatérnék X úrhoz, amit a cikk második részében fogunk látni. Maradjon velünk.