петља догађаја у чвору јс

Petla Dogadaja U Cvoru Js



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

Иако је Јавасцрипт језик са једним навојем, Ноде.јс може доделити задатке оперативном систему, омогућавајући му да обрађује више задатака у исто време. Неколико задатака мора бити обављено у исто време јер су операције у оперативном систему вишенитне. Повратни позив повезан са сваком операцијом се додаје у ред догађаја и Ноде.јс планира да се покрене када се наведени задатак заврши.

Да би написао ефикасан и поуздан Ноде.јс код, корисник мора добро да разуме петље догађаја. Такође може помоћи у ефикасном решавању проблема са перформансама. Петља догађаја у Ноде.јс штеди меморију и омогућава вам да радите више ствари одједном без потребе да чекате да се свака заврши. Термин „асинхрони“ се односи на било коју Јавасцрипт функцију која ради у позадини без блокирања долазних захтева.







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



Јавасцрипт као асинхрони програмски језик

Хајде да погледамо концепте асинхроног програмирања. Јавасцрипт се користи у веб, мобилним и десктоп апликацијама, али треба напоменути да је Јавасцрипт једнонитни, синхрони рачунарски програмски језик.



Дат је једноставан пример кода да би се разумео концепт.





функција метода1 ( ) {

конзола. Пријава ( 'Функција 1' )

}

функција метода2 ( ) {

конзола. Пријава ( 'Функција 2' )

}

метод1 ( )

метод2 ( )

У овом коду су креиране две једноставне функције и прво се позива метод1 како би прво евидентирао метод1, а затим прешао на следећи.

Излаз



Јавасцрипт као синхрони програмски језик

Јавасцрипт је синхрони програмски језик и извршава сваки ред корак по корак крећући се од врха до дна са само једном линијом која се извршава истовремено. У горе наведеном примеру кода метход1 се евидентира прво у терминалу, а затим метод2.

Јавасцрипт као језик за блокирање

Будући да је јавасцрипт синхрони језик, има функцију блокирања. Није важно колико дуго је потребно да се заврши текући процес, али нови процес неће бити покренут док се претходни не заврши. У горњем примеру кода претпоставимо да постоји много скрипте кода у методи1, без обзира колико времена је потребно или 10 секунди или минут, метода2 неће бити извршена док се не изврши сав код у методи1.

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

Јавасцрипт је једнонитни језик

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

Чекање у Јавасцрипт-у

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

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

Синхроно извршавање кода у Јавасцрипт-у

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

У наставку је дат пример који може помоћи у разумевању:

// апплицатион.јс

конзола. Пријава ( 'Један' )

конзола. Пријава ( 'Два' )

конзола. Пријава ( 'три' )

У овом коду постоје три изјаве цонсоле.лог од којих свака штампа нешто. Прво се прва изјава која ће штампати „Један“ у конзоли шаље у стек позива на 1 мс (процењено), а затим се евидентира на терминалу. Након тога, друга изјава се гура у стек позива и сада је време 2 мс са једним додатим из претходне, а затим бележи „Два“ на конзоли. Коначно, последња изјава се гура у стек позива, за сада време је 3 мс и бележи „Три“ у конзоли.

Горњи код се може извршити позивањем следеће команде:

апликација чвора. јс

Излаз

Функционисање је детаљно објашњено горе и узимајући у обзир излаз се пријављује на конзолу у трен ока:

Асинхроно извршавање кода у Јавасцрипт-у

Сада хајде да рефакторишемо исти код тако што ћемо увести повратне позиве и учинити код асинхроним. Горњи код се може рефакторисати као:

// апплицатион.јс
функција принтОне ( позове ) {
сетТимеоут ( функција ( ) {
конзола. Пријава ( 'Један' ) ;
позове ( ) ;
} , 1000 ) ;
}
функција принтТво ( позове ) {
сетТимеоут ( функција ( ) {
конзола. Пријава ( 'Два' ) ;
позове ( ) ;
} , 2000 ) ;
}
функција принтТхрее ( ) {
сетТимеоут ( функција ( ) {
конзола. Пријава ( 'три' ) ;
} , 3000 ) ;
}
конзола. Пријава ( 'Почетак програма' ) ;
принтОне ( функција ( ) {
принтТво ( функција ( ) {
принтТхрее ( ) ;
} ) ;
} ) ;
конзола. Пријава ( 'Крај програма' ) ;

У овом коду изнад:

  • Три функције су декларисане за штампање „Један“, „Два“ и „Три“, свака функција има параметар повратног позива који омогућава секвенцијално извршавање кода.
  • Временско ограничење се поставља помоћу функције сетТимеоут и постоји изјава цонсоле.лог за штампање након одређеног одлагања.
  • Штампају се две поруке „Почетак програма” и „Крај програма” које означавају почетак и крај програма.
  • Програм почиње штампањем „Почетак програма“ након чега се функција принтОне извршава са закашњењем од 1 секунде, затим се функција принтТво извршава са закашњењем од 2 секунде и на крају функција принтТхрее се извршава са 3 секунде кашњење.
  • Програм не чека на извршавање асинхроног кода унутар функција сетТимеоутс које евидентирају наредбу „Крај програма“ пре штампања Оне, Тво и Тхрее.

Излаз

Покрените горњи код тако што ћете извршити ову команду у терминалу:

апликација чвора. јс

Сада би се излаз у терминалу приказао асинхроно као:

Сада када имамо потпуно разумевање синхроног и асинхроног извршења, хајде да скочимо да учврстимо наш концепт петље догађаја у Ноде.јс.

Ноде.јс: Механизам петље догађаја

Извршавањем и синхроних и асинхроних задатака управља петља догађаја у Ноде.јс. Извршење се позива чим се Ноде.јс пројекат покрене и глатко преноси сложене задатке у систем. Ово осигурава да други задаци могу несметано да раде на главној нити.

Визуелно објашњење петље догађаја у Ноде.јс

Петља догађаја је континуирана и полу-бесконачна у Ноде.јс. Петља догађаја се позива почетком скрипте кода Ноде.јс и одговорна је за асинхронизоване АПИ позиве и позивање процеса. Тицк() и заказивање тајмера затим настављају са извршавањем петље догађаја.

У Ноде.јс, пет главних типова редова рукују повратним позивима:

  • „Редо за тајмер“ уобичајено познат као мин-хеап је одговоран за руковање повратним позивима повезаним са „сетТимеоут“ и „сетИнтервал“.
  • Повратним позивима за асинхроне операције као што су модули „фс“ и „хттп“ управља „И/О Куеуе“.
  • „Редо за проверу“ садржи повратне позиве за функцију „сетИммедиате“ која је јединствена за Ноде.
  • „Цлосе Куеуе“ управља повратним позивима повезаним са догађајем затварања било ког асинхроног задатка.
  • На крају, постоје два различита реда у реду „Микро задатака“:
    • Ред „нектТицк“ садржи повратне позиве повезане са функцијом „процесс.нектТицк“.
    • Ред „Обећање“ контролише повратне позиве у вези са изворним обећањем.

Функционалност Петље догађаја у Ноде.јс

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

Највећи приоритет се даје повратним позивима у реду микрозадатака, а затим се крећу да изврше задатке у реду нектТицк, а затим задацима у реду Промисе. Затим се обрађују процеси у редоследу позива тајмера, након чега се ред микрозадатака поново посећује након сваког повратног позива тајмера. Повратни позиви у редовима за улаз/излаз, проверу и затварање се затим извршавају на сличан начин са редом микро задатака који се посећује након сваке фазе.

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

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

Карактеристике петље догађаја у Ноде.јс

Главне карактеристике су:

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

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

Ноде.јс Фазе петље догађаја

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

Петља догађаја прати функционалност Куеуе-а и извршава задатак по принципу први ушао и први изашао. Оперативни систем ће управљати заказаним тајмерима док не истекну. Истекли тајмери ​​се затим додају у ред за повратни позив за тајмере.

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

Фаза тајмера

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

АПИ тајмера има три главне функције:

  • сетТимеоут
  • сетИммедиате
  • сетИнтервал

Горе наведене функције су синхроне. Фаза тајмера у петљи догађаја има свој опсег ограничен на функције сетТимеоут и сетИнтервал. Док функција провере рукује функцијом сетИммедиате.

Хајде да размотримо једноставан пример да учврстимо теоретски део:

// апплицатион.јс

фунцтион делаиедФунцтион ( ) {

конзола. Пријава ( 'одложена функција се извршава након истека времена' ) ;

}

конзола. Пријава ( 'Почетак програма' ) ;

сетТимеоут ( одложена функција, 2000 ) ;

конзола. Пријава ( 'Крај програма' ) ;

У овом коду:

  • Програм почиње евидентирањем изјаве „Почетак програма“ на терминалу.
  • Затим се делаиедФунцтион позива са тајмером од 2 мс, скрипта кода се не зауставља и наставља даље руковање кашњењем у позадини.
  • Изјава „Крај програма се евидентира након прве изјаве.
  • Након кашњења од 2 мс, изјава у делуиедФунцтион се евидентира на терминалу.

Излаз

Излаз ће се приказати као:

Може се видети да код није заустављен да би делаиедФунцтион обрадио; помера се напред и после кашњења се обрађује повратни позив функције.

Повратни позиви на чекању

Петља догађаја проверава догађаје који се дешавају, као што су читање датотека, мрежне активности или улазно/излазни задаци, у фази анкетирања. Важно је знати да се у Ноде.јс само неки од догађаја обрађују у овој фази анкетирања. Међутим, у следећој итерацији петље догађаја, одређени догађаји могу бити одложени у фазу на чекању. Ово је кључни концепт који треба имати на уму приликом оптимизације и решавања проблема Ноде.јс кода који укључује сложене операције вођене догађајима.

Важно је разумети да током фазе повратних позива на чекању, петља догађаја додаје одложене догађаје у ред повратних позива на чекању и изводи их. Ова фаза такође обрађује неке грешке ТЦП утичнице које је систем генерисао, као што су догађаји грешке ЕЦОННРЕФУСЕД на одређеним оперативним системима.

У наставку је наведен пример како би се учврстио концепт:

// апплицатион.јс
конст фс = захтевају ( 'фс' ) ;
функција реадФилеАсинц ( филеПатх, повратни позив ) {
фс. реадФиле ( './ПромисеТект.ткт' , 'утф8' , функција ( грешка, подаци ) {
ако ( ерр ) {
конзола. грешка ( ` Грешка читање датотеке : $ { ерр. порука } ` ) ;
} друго {
конзола. Пријава ( ` Филе садржаја : $ { података } ` ) ;
}
позове ( ) ;
} ) ;
}
конзола. Пријава ( 'Почетак програма' ) ;
реадФилеАсинц ( './ПромисеТект.ткт' , функција ( ) {
конзола. Пријава ( „Повратни позив за читање датотеке је извршен“ ) ;
} ) ;
конзола. Пријава ( 'Крај програма' ) ;

У овом коду:

  • Програм се покреће евидентирањем изјаве „Почетак програма“ у терминалу.
  • РеадФилеАсинц се дефинише асинхроно за читање садржаја датотеке „ПромисеТект.ткт“. То је параметризована функција која извршава функцију повратног позива након што је датотека прочитана.
  • Функција реадФилеАсинц се позива да започне процес читања датотеке.
  • У процесу читања датотеке, програм се не зауставља; уместо тога, прелази на следећу наредбу и пријављује је у терминал „Крај програма“.
  • Асинхрони догађај читања датотеке обрађује се у позадини петља догађаја.
  • Након што је датотека асинхроно прочитана и садржај је евидентиран на терминалу, програм евидентира садржај датотеке на терминалу. Након тога, евидентира следећу поруку „Повратни позив за читање датотеке је извршен“.
  • Петља догађаја управља операцијама повратног позива на чекању у следећој фази.

Излаз

Резултат горе наведеног извршења је:

Неактиван, фаза припреме у Ноде.јс

Фаза мировања се користи за рад са интерним функцијама у Ноде.јс тако да није стандардна фаза. То не утиче на скрипту кода. Фаза мировања је као период паузе за петљу догађаја током које се управља задацима ниског приоритета у позадини. Једноставан пример за разумевање ове фазе је:

конст { неактиван } = захтевају ( 'идле-гц' ) ;

неактиван. игнорисати ( ) ;

У овом коду се користи модул „идле-гц“ који омогућава игнорисање фазе мировања. Ово служи за решавање ситуација када је петља догађаја заузета и позадински задаци се не извршавају. Употреба идле.игноре се не сматра оптималном јер може изазвати проблеме са перформансама.

Фаза анкетирања у Ноде.јс

Фаза анкете у Ноде.јс служи као:

  • Он управља догађајима у реду за анкетирање и извршава њихове одговарајуће задатке.
  • Одлучује колико времена ћете потрошити на чекање и проверу И/О операција у процесу.

Како петља догађаја улази у фазу анкете због одсуства тајмера, један од следећих задатака ће се извршити:

  • У фази анкетирања петље догађаја у Ноде.јс-у, У/И догађаји на чекању се стављају у ред, а затим се извршавају у секвенцијалној процедури по принципу Први уђе и први изађе док ред не постане празан. Током извршавања повратних позива, редови нектТицк и микро задатака су такође у акцији. Ово осигурава глаткоћу и омогућава ефикасније и поузданије руковање И/О операцијама.
  • Ако је ред празан и скрипта није заказана од стране функције сетИммедиате(), онда ће се петља догађаја завршити и прећи на следећу фазу (проверу). С друге стране, ако је заказивање скрипте извршено помоћу функције сетИммедиате(), петља догађаја дозвољава да се повратни позиви додају у ред који ће она извршити.

Ово је најбоље илустровано једноставним примером кода:

сетТимеоут ( ( ) => {

конзола. Пријава ( „Асинхронизована операција је завршена“ ) ;

} , 2000 ) ;

конзола. Пријава ( 'Почетак' ) ;

сетИммедиате ( ( ) => {

конзола. Пријава ( 'сетИммедиате цаллбацк екецутед' ) ;

} ) ;

конзола. Пријава ( 'Крај' ) ;

У овом коду:

  • Две поруке “Старт” и “Енд” означавају покретање и завршетак програма.
  • Функција сетТимеоут() поставља функцију повратног позива са кашњењем од 2 мс и евидентира „Асинхронизована операција је завршена“ на терминал.
  • Функција сетИммедиате() бележи поруку „сетИммедиате цаллбацк екецутед” на терминал након што је Старт порука евидентирана на терминалу.

Излаз

Излаз би показао поруке са само минутним запажањем да је за „асинхронизовану операцију завршено“ потребно време и да се штампа након поруке „Крај“:

Ноде.јс фаза провере

Након што је фаза анкетирања извршена, онда се извршавају повратни позиви у фази провере. Ако је скрипта кода заказана помоћу функције сетИммедиате() и функција анкете је слободна, петља догађаја ради тако што се креће директно у фазу провере уместо да остане неактивна. Функција сетИммедиате() је јединствени тајмер који ради током различитих фаза петље догађаја.

Либув АПИ се користи за планирање извршења повратног позива након што је извршење фазе анкетирања завршено. Током извршавања кода, петља догађаја улази у фазу анкетирања у којој чека на долазне захтеве за повезивање. У другом случају, ако је повратни позив заказан помоћу функције сетИммедиате() и фаза анкетирања је прекинута без икаквих активности, она ће се прећи на фазу провере уместо да чека. Размотрите следећи пример за разумевање:

// апплицатион.јс

конзола. Пријава ( 'Почетак' ) ;

сетИммедиате ( ( ) => {

конзола. Пријава ( 'Одмах повратни позив' ) ;

} ) ;

конзола. Пријава ( 'Крај' ) ;

У овом коду су три поруке пријављене на терминал. Функција сетИммедиате() затим коначно шаље повратни позив да евидентира поруку „ Одмах повратни позив ” до терминала.

Излаз

Излаз горњег кода ће се појавити у следећем низу:

Ноде.јс затварање повратних позива

Ноде.јс користи ову фазу затварања за покретање повратних позива за затварање догађаја и завршетак итерације петље догађаја. Након што је веза затворена, петља догађаја обрађује догађаје затварања у овој фази. У овој фази петље догађаја, „нектТицк()“ и микрозадаци се генеришу и обрађују слично као у другим фазама.

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

Једноставан пример за разматрање је:

// апплицатион.јс
конст нет = захтевају ( 'нет' ) ;
конст сервер = нет. цреатеСервер ( ( соцкет ) => {
соцкет. на ( 'Близу' , ( ) => {
конзола. Пријава ( 'Утичница затворена' ) ;
} ) ;
соцкет. на ( 'подаци' , ( података ) => {
конзола. Пријава ( 'Примљени подаци:' , подаци. тоСтринг ( ) ) ;
} ) ;
} ) ;
сервер. на ( 'Близу' , ( ) => {
конзола. Пријава ( 'Сервер затворен' ) ;
} ) ;
конст Лука = 3000 ;
сервер. слушај ( Лука, ( ) => {
конзола. Пријава ( `Сервер слуша на порту $ { Лука } ` ) ;
} ) ;
сетТимеоут ( ( ) => {
конзола. Пријава ( „Сервер се затвара после 10 секунди“ ) ;
сервер. Близу ( ) ;
процес. излаз ( ) ;
} , 10000 ) ;

У овом коду:

  • цонст нет = рекуире('нет') ” увози мрежни модул потребан за руковање ТЦП сервером и “ цонст сервер = нет.цреатеСервер((соцкет) => { ” креира нову инстанцу ТЦП сервера.
  • соцкет.он(‘цлосе’, () => {… } ” слуша „затварање” на свим утичницама. Када је утичница затворена, на терминал се евидентира порука „Утичница затворена“.
  • соцкет.он(‘подаци’, (подаци) => {} ” проверава долазне податке са свих појединачних сокета и штампа их помоћу функције „.тоСтринг()”.
  • сервер.он(‘затвори’, () => {…} ” проверава догађај „затвори” на самом серверу, а када је веза са сервером затворена, бележи поруку „Сервер затворен” на терминал.
  • сервер.листен(порт, () => {…} ” слуша долазне везе на порту.
  • сетТимеоут(() => {…} ” поставља тајмер од 10 мс за затварање сервера.

Тиме је завршена дискусија о различитим фазама петље догађаја у Ноде.јс. Пре него што пређемо на закључак хајде да разговарамо о последњој ствари, а то је како изаћи из петље догађаја у Ноде.јс.

Излазак из петље догађаја у Ноде.јс

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

Експлицитни начин да се прекине петља догађаја је коришћење методе “.екит”. Активни процеси Ноде.јс ће се прекинути одмах чим се позове функција процесс.екит. Сви заказани догађаји и догађаји на чекању ће бити одбачени:

процес. на ( 'излаз' , ( код ) => {

конзола. Пријава ( `Излазак са излазним кодом : $ { код } ` ) ;

} ) ;

процес. излаз ( 1 ) ;

Корисници могу слушати функцију .екит. Треба напоменути да функција “.екит” мора бити синхрона јер ће програм Ноде.јс изаћи чим послуша овај догађај.

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

Закључак

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