Како петља догађаја функционише у ЈаваСцрипт-у?

Иако ће можда требати детаљно разумевање језика као што су Ц ++ и Ц да би написали производни код целог опсега, ЈаваСцрипт се често може писати само уз основно разумевање шта се може учинити са језиком.


Концепти, попут пребацивања повратних позива функцијама или писање асинкроног кода, често нису толико тешки за имплементацију, због чега већина програмера ЈаваСцрипт брине мање о томе шта се дешава испод хаубе. Једноставно им није стало до разумевања сложености која су их језик дубоко апстрахирали.

Као ЈаваСцрипт програмеру, постаје све важније схватити шта се заиста дешава под хаубом и како већина ових сложености која су апстрахирана од нас заиста делује. Помаже нам да доносимо више информисаних одлука, што може заузврат драстично повећати наше перформансе кода.

Овај се чланак фокусира на један од веома важних, али ријетко схваћених концепата или појмова у ЈаваСцрипт-у. Тхе ДОГАЂАЈ ЛООП!. 

Писање асинхроног кода не може се избећи у ЈаваСцрипт-у, али зашто код који ради асинхроно заиста значи? тј. Петља догађаја

Пре него што схватимо како петља догађаја функционише, прво морамо да разумемо шта је сам ЈаваСцрипт и како функционише!

Шта је ЈаваСцрипт?

Пре него што наставимо, волео бих да направимо корак назад до самих основа. Шта је ЈаваСцрипт? Могли бисмо дефинисати ЈаваСцрипт као;

ЈаваСцрипт је високо интерпретирани, једносмерени, неблокирајући, асинхрони, истовремени језик.

Чекај, шта је ово? Књиговодна дефиниција? ��

Разбијемо га!

Кључне речи у овом чланку су једноструки, не блокира, истовремено, и асинхрони.

Једна нит

Конац извршења је најмањи низ програмиране инструкције којом планер може самостално управљати. Програмски језик је једносметан, што значи да може обављати само један задатак или операцију у исто време. То значи да би извео читав процес од почетка до краја без да се нит прекида или заустави.

За разлику од језика с више навоја где се више процеса може истовремено покренути на више нити без блокирања.

Како ЈаваСцрипт може бити једносметан и не блокира истовремено?

Али шта значи блокада??

Не блокира

Не постоји једна дефиниција блокирања; то једноставно значи ствари које се полако врте по нити. Дакле, неблокирање значи ствари које нису споре на нит.

Али чекај, да ли сам рекао да ЈаваСцрипт ради на једној нити? А рекао сам и да не блокира, што значи да се задатак брзо извршава на стацку позива? Али како??? Шта кажете на покретање тајмера? Петље?

Опустити! Сазнаћемо за мало ��.

Паралелно

Паралелност значи да се код истовремено извршава са више нити.

Ок, ствари постају стварно чудан сада, како ЈаваСцрипт може бити једносметан и истовремено бити истовремено? тј. извршавање његовог кода са више од једне нити?

Асинхрони

Асинхроно програмирање значи да се код ради у кругу догађаја. Када постоји операција блокирања, догађај се покреће. Блокирајући код и даље ради без блокирања главне извршне нити. Кад се код за блокирање заврши, тај ред је резултат блокаде и враћа их назад у стог.

Али ЈаваСцрипт има једну нит? Шта онда извршава овај блокирни код док допушта извршење других кода у нити?

Пре него што наставимо, направимо сажетак горе наведеног.

  • ЈаваСцрипт је једносметан
  • ЈаваСцрипт не блокира, тј. Спори процеси не блокирају његово извршавање
  • ЈаваСцрипт је истовремено, тј. Извршава свој код у више нити у исто време
  • ЈаваСцрипт је асинхрони, тј. Покреће блокадни код негде другде.

Али горе наведено се не тачно уклапа у то како један-нитни језик може бити неблокирајући, истовремени и асинхрони?

Идемо мало дубље, спустимо се на ЈаваСцрипт рунтиме моторе, В8, можда има скривене нити којих нисмо свесни.

В8 Мотор

В8 мотор је високо-перформансни, опен-соурце веб систем трајања веб склопа за ЈаваСцрипт, написан на Ц ++ од стране Гоогле-а. Већина прегледача покреће ЈаваСцрипт користећи В8 енгине, а користи га и популарно окружење за покретање окружења.

Једноставним енглеским језиком В8 је Ц ++ програм који прима ЈаваСцрипт код, компајлира га и извршава.

В8 ради две главне ствари;

  • Расподјела меморије
  • Контекст извршавања скупа позива

Нажалост, наша сумња је била погрешна. В8 има само један степен позива, помислите на низ позива као на нит.

Једна нит === један стацк позива === једно извршење у исто време.

Слика – Хацкер Ноон

Будући да В8 има само један скуп позива, како се онда ЈаваСцрипт покреће истовремено и асинкроно без блокирања главне извршне нити?

Покушајмо то да сазнамо тако што ћемо написати једноставан, али уобичајен асинхрони код и заједно га анализирати.

ЈаваСцрипт покреће сваки код по ред, један за другим (једноцифрени). Као што се очекивало, овде се штампа први ред у конзоли, али зашто се последњи ред штампа пре кода тимеоут-а? Зашто поступак извршења не чека код за истек времена (блокирање) прије него што покренете задњи ред?

Чини се да нам је нека друга нит помогла да извршимо тај временски период јер смо прилично сигурни да нит може извршити само један задатак у било којем тренутку.

Идемо завирити у то Изворни код В8 за неко време.

Чекај шта??!!! У В8 нема тајмера, нема ДОМ-а? Нема догађаја? Нема АЈАКС?…. Иееееесссс!!!

Догађаји, ДОМ, тајмери ​​итд. Нису део основне имплементације ЈаваСцрипта, ЈаваСцрипт је строго у складу са спецификацијама Ецма Сцриптс, а разне верзије истог често се називају у складу са његовим спецификацијама Ецма Сцриптс (ЕС Кс).

Екецутион Воркфлов

Догађаји, тајмери, Ајак захтеви пружају се на страни клијента од стране претраживача и често се називају Веб АПИ. Они омогућавају једнослојни ЈаваСцрипт да не блокира, истовремено и асинхроно! Али како?

Постоје три главна одељења у процесу извођења било којег ЈаваСцрипт програма, стацк позива, веб АПИ и ред задатака.

Позив позива

Корак је структура података у којој је последњи додавани елемент увек први који је уклоњен из снопа, а можете то замислити као сноп плоче у којој прво може да се уклони само прва плоча која је последња додата. Позив позива једноставно није ништа друго него структура података снопа података у којој се задаци или код извршавају у складу с тим.

Размотримо следећи пример;

Извор – хттпс://иоуту.бе/8аГхЗКкоФбК

Када позовете функцију принтСкуаре (), она се гура на стог позива, функција принтСкуаре () позива функцију скуаре (). Квадратна () функција се гура на сноп и такође позива функцију множења (). Функција множења се гура на сноп. Будући да се функција множења враћа и последња је ствар која је гурнута у сноп, прво се она решава и уклања се из снопа, након чега слиједи функција скуаре (), а затим принтСкуаре ().

Веб АПИ

Овде се извршава код који В8 мотор не управља и не блокира главну нит извршења. Када се Стацк позива нађе на функцији веб АПИ-ја, поступак се одмах предаје Веб АПИ-у, где се извршава и ослобађа сталак позива да изврши друге операције током његовог извршавања..

Вратимо се нашем горе наведеном примеру сетТимеоут;

Када покренемо код, прва линија цонсоле.лог се гура у стог и добијамо наш излаз готово одмах, при доласку до временског ограничења, тајмерима се рукује претраживач и нису део основне имплементације В8, помера се на Веб АПИ уместо тога, ослобађајући сноп да би могао обављати друге операције.

Док се тимеоут још увијек покреће, сноп иде према сљедећој линији акције и покреће посљедњи цонсоле.лог, што објашњава зашто добијамо тај излаз прије исписа тајмера. Једном када се тајмер заврши, догоди се нешто. Цонсоле.лог у том тимеру магично се поново појављује у скупу позива!

како?

Петља догађаја

Пре него што размотримо петљу догађаја, прво да прођемо кроз функцију реда послова.

Повратак на наш пример прекида, када Веб АПИ заврши извршавање задатка, неће га аутоматски аутоматски вратити натраг у стог позива. То иде на Ред послова. 

Ред чекања је структура података која функционише по принципу Први у првом реду, тако да се задаци гурају у ред и излазе истим редоследом. Задаци које су извршили Веб АПИ-и, а који су гурнути у ред задатака, а затим се вратите на стацк позива да бисте исписали њихов резултат.

Али чекај. ШТА ЈЕ ТОЧАК ДОГАЂАЈИ ЛООП???

Извор – хттпс://иоуту.бе/8аГхЗКкоФбК

Петља догађаја је процес који чека да се очисти сталак позива прије него што се позиви повратних позива из реда задатака преусмјере на стак позива. Једном када је Стацк очишћен, петља догађаја активира и провјерава у реду задатка доступне повратне позиве. Ако их има, он га гурне у стог позива, чека да се Позив позива поново очисти и понавља исти поступак.

Извор – хттпс://ввв.куора.цом/Хов-доес-ан-евент-лооп-ворк/ансвер/Тимотхи-Маквелл

Горњи дијаграм приказује основни тијек рада између петље догађаја и реда задатака.

Закључак

Иако је ово врло основни увод, концепт асинхроног програмирања у ЈаваСцрипт-у даје довољно увида да се јасно разуме шта се дешава испод хаубе и како се ЈаваСцрипт може истовремено и асинхроно покретати са само једним нити.

ЈаваСцрипт је увек на захтев, а ако желите знати шта да научите, саветујем вам да ово проверите Курс Удеми.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map