Разумевање синхроног и асинкроног ЈаваСцрипта - Део 1
Синхроно и асинхроно су збуњујући концепти у ЈаваСцрипту, посебно за почетнике. Две или више ствари су синхроно када они догодити у исто вријеме (синхронизовано), и асинхроно када не (није синхронизовано).
Иако су ове дефиниције лако прихватити, заправо је компликованије него што изгледа. Морамо узети у обзир шта је тачно синхронизовано, и шта није.
Вероватно бисте назвали нормал
функција у ЈаваСцрипт синхроно, зар не? И ако је нешто слично сетТимеоут ()
или АЈАКС са којим радите, назват ћете га асинкроним, зар не? Шта ако вам то кажем и једно и друго на неки начин асинхрони?
Да објасним зашто, морамо се обратити господину Кс-у за помоћ.
Сценариј 1 - г. Кс покушава да се синхронизује
Ево подешавања:
- Господин Кс је неко ко може одговорити на тешка питања и извршити било који задати задатак.
- Једини начин да га контактирате је телефонски позив.
- Какво год питање или задатак сте добили, како бисте од господина Кса затражили помоћ да то изведе; Зови га.
- Господин Кс вам даје одговор или довршава задатак одмах, и обавештава вас готово је.
- Спустите слушалицу и осетите садржај и изађите на филм.
Оно што сте управо извели је синхрона (назад и напријед) комуникација са г. Кс. Слушао је док сте му постављали питање, и слушали сте га док је одговарао.
Сценарио 2 - Мр Кс није задовољан синкроницитетом
Пошто је г. Кс тако ефикасан, он прима више позива. Па шта се дешава када га позовеш већ је заузет разговарате са неким другим? Нећеш моћи да му поставиш питање - не док не буде слободан да прими твој позив. Све што ћете чути је тон заузетости.
Дакле, шта господин Кс може да уради у борби против овога?
Уместо директног узимања позива:
- Господин Кс унајмљује новог момка, господина М и даје му телефонску секретарицу за позиве оставити поруке.
- Посао господина М. је да то уради проследите поруку од телефонске секретарице до г. Кс када он зна да је г. Кс потпуно завршио обраду свих претходних порука и већ је слободни да узмете нови.
- Дакле, сада када га позовете, уместо да добијете заузет тон, морате оставити поруку за г. Кс, онда чекај да те назове (још нема времена за филм).
- Када господин Кс заврши са свим порукама које је примио прије него што је примио, он ће размотрити ваше питање, и позвати вас да вам дам одговор.
Сада се поставља питање: да ли су досадашње акције синхроно или асинхроно?
Мијешано је. Када оставите поруку, Господин Кс није га слушао, тако да је четврта комуникација била асинхрона.
Али кад је одговорио, били сте тамо слушајући, која чини повратну комуникацију синхроном.
Надам се да сте до сада стекли боље разумевање о томе како се синхронизација доживљава у смислу комуникације. Време је да унесете ЈаваСцрипт.
ЈаваСцрипт - Асинцхроноус Программинг Лангуаге
Када неко означи ЈаваСцрипт асинкроно, оно на шта се уопште мисли односи је како можете остави поруку за то, и Ваш позив није блокиран са заузетим тоном.
Позиви функције су никада не усмјерите ЈаваСцрипт, они су буквално готови путем порука.
ЈаваСцрипт користи а ред порука где се одржавају долазне поруке (или догађаји). Ан евент-лооп (порука диспечера) секвенцијално шаље те поруке у цалл стацк где су одговарајуће функције порука сложени као оквири (функција аргуементс & вариаблес) за извршење.
Стацк позива држи оквир иницијалне функције која се зове, и било које друге оквире за функције које се зову преко угнежђених позива на врху .
Када се порука придружи реду чекања, чека док се стог позива празна од свих оквира из претходне поруке, и када је, догађај-петља одузима претходну поруку, и додаје одговарајуће оквире тренутне поруке у скуп позива.
Порука цека поново док стацк позива не постане празних оквира (тј. извршења свих сложених функција су завршена), затим се укида.
Размотрите следећи код:
функција фоо () функција бар () фоо (); функција баз () бар (); баз ();
Функција која се покреће је баз ()
(у последњем реду исјечка кода), за које порука се додаје у ред, и када је петља догадјаја покупи, стог позива почиње слагање оквира за баз ()
, бар ()
, и фоо ()
на релевантним тачкама извршења.
Када се извршавање функција заврши један по један, њихови оквири су уклоњен из скупа позива, док је порука још увек чекају у реду, све док баз ()
искаче из стог.
Запамтите, позиви функција су никада не усмјерите ЈаваСцрипт, готови су путем порука. Дакле, кад год чујете да неко каже да је сам ЈаваСцрипт асинкрони програмски језик, претпоставите да они говоре о његовом уграђеном “Телефонска секретарица”, и како можете слободно остављати поруке.
Али шта је са специфичним асинхроним методама?
До сада нисам дотакао АПИ-је као што је сетТимеоут ()
и АЈАКС, то су они који су посебно означен као асинхрони. Зашто је то?
Важно је разумети шта је тачно синхроно или асинхроно. ЈаваСцрипт, уз помоћ догађаја и евент-лооп-а, може вежбати асинхрона обрада порука, али то не значи све у ЈаваСцрипт-у је асинхроно.
Запамтите, рекао сам вам да порука није отишла све док није био стог позива празних оквира, баш као што нисте отишли у филм док не добијете одговор - то је бити синхрони, чекате док се задатак не заврши, и добијете одговор.
Ваитинг није идеалан у свим сценаријима. Шта ако након напуштања поруке, уместо чекања, можете отићи за филм? Шта ако функција може да се повуче (пражњење стог позива), а њена порука може бити искључена чак и пре него што се задатак функције заврши? Шта ако можете имати асинкроно извршен код?
Овде АПИ-ји као што су сетТимеоут ()
АЈАКС је дошао на слику, а оно што они раде је ... сачекајте, не могу ово објаснити без повратка на г. Кс, што ћемо видети у другом делу овог чланка. Будите у току.