Емитери догађаја су објекти у НодеЈС-у који покрећу догађаје слањем поруке која сигнализира да се акција догодила.

Ноде.јс обезбеђује уграђени модул догађаја. Садржи класу емитера догађаја која вам омогућава да креирате и управљате прилагођеним догађајима преко функција повратног позива.

Овде ћете научити како да емитујете догађаје, слушате и рукујете подацима о догађајима, као и како да рукујете грешкама догађаја у НодеЈС-у.

Емитинг Евентс

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

Овако:

конст ЕвентЕмиттер = захтевају("догађаји");

// Инстанцирање ЕвентЕмиттер-а
конст миЕмиттер = Нова ЕвентЕмиттер();

Можете емитовати догађаје користећи ЕвентЕмиттер’с емитовати методом. Тхе емитовати метода узима ан Назив догађаја и произвољан број аргумената као параметара.

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

истина ако је догађај имао слушаоце и лажно ако није имало слушаоца.

На пример:

миЕмиттер.емит("ТестЕвент", "фоо", "бар", 1, 2);

У блоку кода изнад, положили сте ТестЕвент као што је Назив догађаја, и „фоо,” „бар,” 1, и 2 као аргументи. Када се горњи блок кода покрене, он ће обавестити све слушаоце који слушају ТестЕвент догађај. Позваће те слушаоце са датим аргументима.

Слушање догађаја

Можете да слушате емитоване догађаје користећи ЕвентЕмиттер’с на методом. Тхе на метода узима ан Назив догађаја и функција повратног позива као параметри. Када је догађај са Назив догађаја прешао у на се емитује, позива своју функцију повратног позива. Овај метод враћа референцу на ЕвентЕмиттер, што вам омогућава да повежете више позива.

На пример:

// Први слушалац
миЕмиттер.он("ТестЕвент", () => {
цонсоле.лог("ТестЕвент Емиттед!!!");
}); // ТестЕвент Емиттед!!!

// Други слушалац
миЕмиттер.он("ТестЕвент", (...аргс) => {
аргс = аргс.јоин(", ");
конзола.Пријава(`Догађај емитован са следећим аргументима: ${аргс}`);
}); // Догађај који се емитује са следећим аргументима: фоо, бар, 1, 2

миЕмиттер.емит("ТестЕвент", "фоо", "бар", 1, 2);

У блоку кода изнад, када је ТестЕвент догађај емитује, слушаоци догађаја ће позвати своје функције повратног позива. Слушаоци ће реаговати редоследом којим сте их регистровали, што значи да ће се повратни позив „првог слушаоца“ покренути пре другог, итд.

Ово понашање можете променити користећи ЕвентЕмиттер’с препендЛистенер методом. Овај метод узима исте параметре као на методом. Разлика је у томе што овај метод прво реагује на догађај, без обзира на време када га региструјете.

На пример:

миЕмиттер.он("ТестЕвент", () => {
цонсоле.лог("ТестЕвент Емиттед!!!");
});

миЕмиттер.препендЛистенер("ТестЕвент", () => {
цонсоле.лог("Прво извршава")
})

// цонсоле.лог (миЕмиттер.листенерс("ТестЕвент"));
миЕмиттер.емит("ТестЕвент", "фоо", "бар", 1, 2);

Када се горњи кодни блок изврши, „Прво изврши“ ће се прво пријавити на конзолу, а затим „Емитован тест догађаја!!!“ без обзира на редослед којим сте их регистровали због препендЛистенер методом.

Ако региструјете неколико слушалаца са препендЛистенер методом, они ће тећи редом од последњег до првог.

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

За контекст, размотрите блок кода у наставку:

миЕмиттер.емит("ТестЕвент", "фоо", "бар", 1, 2);

миЕмиттер.он("ТестЕвент", () => {
цонсоле.лог("ТестЕвент Емиттед!!!");
});

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

Слушање догађаја једном

У зависности од ваших захтева, можда ћете морати да обрађујете неке догађаје само једном у животном циклусу ваше апликације. То можете постићи користећи ЕвентЕмиттер’с једном методом.

Овај метод узима исте аргументе као и на метода и ради на сличан начин. Једина разлика је у томе што су се слушаоци регистровали код једном метод само једном слуша догађај.

На пример:

миЕмиттер.онце("СинглеЕвент", () => {
цонсоле.лог("Догађај обрађен једном");
});

миЕмиттер.емит("СинглеЕвент"); // Догађај се обрађује једном
миЕмиттер.емит("СинглеЕвент"); // Игнорирано
миЕмиттер.емит("СинглеЕвент"); // Игнорирано

Покретање блока кода ће само једном евидентирати „Догађај обрађен једном“ на конзоли, без обзира на то колико често емитер емитује догађај.

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

Руковање грешкама са емитерима догађаја

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

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

На пример:

миЕмиттер.он("грешка", (грешка) => {
конзола.еррор(`Грешка: ${еррор}`);
});

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

На пример:

миЕмиттер.емит("грешка", нова грешка("Ово је грешка"));

Покретање блока кода изнад ће евидентирати „Ово је грешка“ на конзоли јер слушалац обрађује догађаје грешке.

Управљање слушаоцима догађаја

Тхе ЕвентЕмиттер класа има неколико метода које вам омогућавају да манипулишете и управљате слушаоцима догађаја. Можете добити слушаоце догађаја, уклонити их и поставити максималан број слушалаца за догађај.

Ево табеле која садржи ЕвентЕмиттер методе којима можете манипулисати слушаоцима догађаја:

Метод Аргументи Повратна вредност
листенерЦоунт Назив догађаја Враћа број слушалаца који су претплаћени на догађај
слушаоци Назив догађаја Враћа низ слушалаца
ремовеЛистенер Назив догађаја Уклања најмање једног слушаоца из наведеног евентНаме.
ремовеАллЛистенерс Назив догађаја Уклања све слушаоце за наведени евентНаме. Ако не наведете име догађаја, овај позив методе ће уклонити све слушаоце за ЕвентЕмиттер.
сетМакЛистенерс број Мења подразумевани максимални број слушалаца по догађају. Користите бесконачност или нулу да означите неограничен број слушалаца. Подразумевано, можете да претплатите само десет слушалаца на догађај.

Ове методе можете позвати само на ЕвентЕмиттер инстанце.

На пример:

миЕмиттер.ремовеЛистенер("ТестЕвент");

Горњи блок кода уклања једног слушаоца за ТестЕвент догађај.

Важност емитера догађаја

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