Управљање догађајима у Ноде.јс -у

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

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

Међутим, да бисмо ушли са емитерима догађаја, прво морамо бити јасни око неких концепата, као што су неки обрасци ових функција, врсте догађаја, па чак и слушаоци.

ЗахтевиЗа извођење вежби предложених у овом водичу морамо имати функционалну инсталацију Ноде.јс у нашем систему, можемо да погледамо овај водич пре него што наставимо да се упуштамо у њега. Такође је важно да имате приступ уређивачу обогаћеног текста за кодирање примера, можемо да користимо све што нам одговара, међутим, због једноставности употребе, препоручујемо Узвишени текст о НотеПад ++ који такође има додатке за синтаксу ЈаваСцрипт И ХТМЛ.

Образац за повратне позиве


Асинхроно програмирање не користи враћање вредности у функцијама да означи да је та функција управо завршена, већ позива чувени повратни позив по завршетку операције како би наш програм могао да се настави, где ЈаваСцрипт Дошао сам до ове врсте програмирања, да видимо пример у Не дају који чита датотеку и учитава њен садржај у меморију:
 вар фс = рекуире ('фс'); фс.реадФиле ('филе.ткт', фунцтион (ерр, филеЦонтент) {иф (ерр) {тхров ерр;} цонсоле.лог ('Садржај датотеке:', филеЦонтент.тоСтринг ());});
Оно што ми овде радимо је да шаљемо анонимну функцију као други аргумент функције фс.реадФиле, и како можемо видети да је први аргумент функције повратног позива објекат грешке, који ће имати инстанцу класе Еррор ако дође до грешке.

Образац за емитер догађаја


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

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

 вар рек = хттп.рекуест (опције, функција (одговор) {респонсе.он ("подаци", функција (подаци) {цонсоле.лог ("Неки одзивни подаци", подаци);}); респонсе.он ("енд" , фунцтион () {цонсоле.лог ("довршен одговор");});}); рек.енд ();
Ово је чисто објашњење, где можемо видети неке од корака за подношење захтева ХТТП на удаљени сервер, али нам омогућава да видимо како је објект одговора емитер догађаја, који може емитовати не само података И крај али и друге врсте догађаја.

Врсте догађаја


Према претходном примеру могли смо видети да емитовани догађаји увек имају тип, који је представљен низом, у овом случају "података"И"крај”, Који ће бити произвољни низови које је одредио издавалац догађаја.

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

 вар ем = нев (рекуире ('евентс'). ЕвентЕмиттер) (); ем.емит ('евент1'); ем.емит ('еррор', нев Еррор ('Моја грешка')));
Ако га покренемо кроз конзолу, можемо видети како Не дају говори нам да не решавамо грешку, стварајући тако нехваћен изузетак:

Пошто смо видели како се догађаји понашају на општи начин, хајде да видимо како користимо АПИ емитер догађаја.

Коришћење АПИ -ја за емитовање догађаја


Сваки објекат који имплементира образац емитовања догађаја имплементира низ догађаја као што видимо испод:

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

Коришћење .аддЛистенер () или .он () у повратним позивима


Навођењем типа догађаја и функције позове, можемо снимити радњу коју треба предузети када се догоди одређени догађај. На пример, ако желимо да будемо обавештени да је део података доступан и да емитује догађај типа података, можемо учинити следеће:
 функција рецеивеДата (дата) {цонсоле.лог ("Подаци су добијени:% ј", подаци); } реадФлов.аддЛистенер ("подаци", пријем података);
Такође можемо користити метод .на () што је само пречица, да видимо еквивалент претходног кода:
 функција рецеивеДата (дата) {цонсоле.лог ("Подаци су добијени:% ј", подаци); } реадФлов.он ("дата", рецеивеДата);
Можемо чак додати више слушалаца за наше догађаје да слушају исту врсту догађаја на истом предајнику, на пример:

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

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

Где се у овом примеру други слушалац неће позвати пошто је први направио грешку.

Коришћење .ремовеЛистенер ()


Ако у било ком тренутку више не желимо да будемо обавештени о променама одређеног догађаја или објекта, можемо зауставити снимање тако што ћемо навести врсту догађаја и функцију повратног позива на следећи начин:

Коришћење .онце ()


У случају да наша апликација ослушкује догађај који ће се догодити барем једном или ако нас занима само да се то догоди само једном, можемо користити .Једанаест(), која додаје слушаоца и уклања га када се догоди први догађај:

Коришћење .ремовеАллЛистенерс ()


Коначно, можемо уклонити све слушатеље за одређену врсту догађаја из емитера догађаја на следећи начин:
 иссуеер.ремовеАллЛистенерс (тип);

Креирање емитера догађаја


Одашиљач догађаја пружа нам генерички начин стварања интерфејса, будући да везујемо догађаје уместо функција, чинећи наш програм флексибилнијим, чак и ако желимо да користимо образац Ноде.јс У целој нашој апликацији можемо створити псеудо-класу и наследити од ЕвентЕмиттер као што следи:
 утил = рекуире ('утил'); вар ЕвентЕмиттер = рекуире ('евентс'). ЕвентЕмиттер; вар МиЦласс = фунцтион () {} утил.инхеритс (МиЦласс, ЕвентЕмиттер);
На овај начин методе ЕвентЕмиттер Они ће бити доступни за нашу инстанцу и можемо их користити без проблема и на овај начин Мој разред може емитовати догађаје:
 МиЦласс.прототипе.сомеМетход = фунцтион () {тхис.емит ("прилагођени догађај", "аргумент 1", "аргумент 2"); };
Овде када неки метод се позива у случају Мој разред, пример емитује догађај тзв прилагођени догађај, при чему емитује два различита податка, аргумент 1 и аргумент 2, који ће бити послати слушатељима догађаја. Коначно у случајевима Мој разред на страни клијента можете слушати прилагођени догађај као што следи:
 вар МиЦласс = нови МиЦласс (); МиЦласс.он ('прилагођени догађај', функција (стр1, стр2) {цонсоле.лог ('Прилагођени догађај преслушан са аргументима стр1% с и стр2% с!', Стр1, стр2);});
Као што видимо, употреба догађаја заједно са одашиљачем догађаја помаже нам да комуницирамо са нашом апликацијом и тако смо завршили овај водич, где смо успели да одемо даље од асинхроног програмирања и праксе примене које нам помажу да одржимо стандард и оптимално за наше апликације.

wave wave wave wave wave