Излъчвателите на събития са обекти в NodeJS, които задействат събития, като изпращат съобщение, за да сигнализират, че е извършено действие.
Node.js предоставя вграден модул за събития. Той съдържа клас излъчвател на събития, който ви позволява да създавате и обработвате персонализирани събития чрез функции за обратно извикване.
Тук ще научите как да излъчвате събития, да слушате и обработвате данни за събития и да обработвате грешки при събития в NodeJS.
Излъчване на събития
Модулът за събития е основна част от сървърната среда на Node.js. Следователно не е необходимо да го инсталирате, но преди да използвате EventEmitter клас, трябва да импортирате от модула за събития и да го инстанциирате.
Така:
конст EventEmitter = изискват(„събития“);
// Създаване на EventEmitter
конст myEmitter = нов EventEmitter();
Можете да излъчвате събития, като използвате EventEmitter'с излъчвам метод. The излъчвам методът отнема eventName и произволен брой аргументи като параметри.
След като се обадите на излъчвам метод, той излъчва преминалия
eventName. След това извиква синхронно всеки от слушателите на събитието в реда, в който сте ги регистрирали, като предава предоставените аргументи на всеки. Накрая се връща вярно ако събитието имаше слушатели и невярно ако нямаше слушатели.Например:
myEmitter.emit("TestEvent", "Фу", "бар", 1, 2);
В кодовия блок по-горе преминахте TestEvent като Име на събитието, и "фу,” "бар,” 1, и 2 като аргументи. Когато кодовият блок по-горе се изпълни, той ще уведоми всички слушатели, които слушат за TestEvent събитие. Той ще извика тези слушатели с дадените аргументи.
Слушане за събития
Можете да слушате за излъчвани събития, като използвате EventEmitter'с На метод. The На методът отнема Име на събитието и функция за обратно извикване като параметри. Когато събитието с Име на събитието премина в На методът се излъчва, той извиква своята функция за обратно извикване. Този метод връща препратка към EventEmitter, което ви позволява да свържете няколко обаждания във верига.
Например:
// Първи слушател
myEmitter.on("TestEvent", () => {
console.log("TestEvent Излъчено!!!");
}); // Излъчено е тестово събитие!!!// Втори слушател
myEmitter.on("TestEvent", (...args) => {
args = args.join(", ");
конзола.log(`Излъчено събитие със следните аргументи: ${args}`);
}); // Излъчено събитие със следните аргументи: foo, bar, 1, 2
myEmitter.emit("TestEvent", "Фу", "бар", 1, 2);
В кодовия блок по-горе, когато TestEvent събитие излъчва, слушателите на събитието ще извикат своите функции за обратно извикване. Слушателите ще реагират в реда, в който сте ги регистрирали, което означава, че обратното извикване на „първия слушател“ ще се изпълнява преди второто и т.н.
Можете да промените това поведение, като използвате EventEmitter'с prependListener метод. Този метод приема същите параметри като На метод. Разликата е, че този метод реагира първи на събитието, независимо от времето, в което го регистрирате.
Например:
myEmitter.on("TestEvent", () => {
console.log("TestEvent Излъчено!!!");
});myEmitter.prependListener("TestEvent", () => {
console.log("Първо изпълнява")
})
// console.log (myEmitter.listeners("TestEvent"));
myEmitter.emit("TestEvent", "Фу", "бар", 1, 2);
Когато кодовият блок по-горе се изпълни, „Първо се изпълнява“ ще бъде регистрирано първо в конзолата, последвано от „TestEvent Emitted!!!“ независимо от реда, в който сте ги регистрирали поради prependListener метод.
Ако регистрирате няколко слушатели в prependListener метод, те ще се изпълняват в ред от последния до първия.
Обърнете внимание на разположението на излъчвателя и слушателите. Слушателите винаги идват преди излъчвателя. Тази подредба е така, защото слушателите трябва вече да слушат за събитието, преди излъчвателят да го излъчи.
За контекст разгледайте кодовия блок по-долу:
myEmitter.emit("TestEvent", "Фу", "бар", 1, 2);
myEmitter.on("TestEvent", () => {
console.log("TestEvent Излъчено!!!");
});
Ако стартирате кодовия блок по-горе, нищо не се случва, защото по времето, когато емитерът е излъчил събитието, никой слушател не е слушал събитието.
Слушане за събития веднъж
В зависимост от вашите изисквания може да се наложи да обработвате някои събития само веднъж в жизнения цикъл на вашето приложение. Можете да постигнете това с помощта на EventEmitter'с веднъж метод.
Този метод приема същите аргументи като На метод и работи по подобен начин. Единствената разлика е, че слушателите се регистрираха в веднъж метод слуша само веднъж за събитието.
Например:
myEmitter.once("Единично събитие", () => {
console.log("Събитието се обработва веднъж");
});
myEmitter.emit("Единично събитие"); // Събитието се обработва веднъж
myEmitter.emit("Единично събитие"); // Игнорирано
myEmitter.emit("Единично събитие"); // Игнорирано
Изпълнението на кодовия блок ще регистрира „Събитие, обработено веднъж“ в конзолата само веднъж, независимо от това колко често емитерът излъчва събитието.
Слушатели, регистрирани в веднъж метод реагират на събитието в реда, в който ги регистрирате. Можете да промените това поведение, като използвате prependOnceListener метод, който работи като prependListener. Единствената разлика е, че слушателите се регистрираха в веднъж метод слуша само веднъж за събитието.
Обработка на грешки с излъчватели на събития
Трябва да се погрижите за обработват правилно грешките в JavaScript и слушателите на събития не са изключение. Необработените грешки от тях ще доведат до спиране на процеса Node.js и до срив на приложението ви.
За да обработи събитие за грешка, поне един от слушателите на събитието трябва да има него Име на събитието настроен на грешка.
Например:
myEmitter.on("грешка", (грешка) => {
конзола.грешка(`Грешка: ${грешка}`);
});
Ако слушател обработва потенциална грешка, както в кодовия блок по-горе, ще спре приложението да се срива, когато възникне грешка.
Например:
myEmitter.emit("грешка", нова грешка("Това е грешка"));
Изпълнението на кодовия блок по-горе ще регистрира „Това е грешка“ в конзолата, защото слушател обработва събития за грешка.
Управление на слушатели на събития
The EventEmitter class има няколко метода, които ви позволяват да манипулирате и управлявате слушатели на събития. Можете да получите слушатели на събитие, да ги премахнете и да зададете максималния брой слушатели за събитие.
Ето таблица, съдържаща EventEmitter методи, с които можете да манипулирате слушатели на събития:
Метод | Аргументи | Върната стойност |
---|---|---|
listenerCount | eventName | Връща броя слушатели, абонирани за събитие |
слушатели | eventName | Връща масив от слушатели |
removeListener | eventName | Премахва поне един слушател от определено име на събитието. |
removeAllListeners | eventName | Премахва всички слушатели за определено eventName. Ако не посочите име на събитие, това извикване на метод ще премахне всички слушатели за EventEmitter. |
setMaxListeners | номер | Променя максималния брой слушатели по подразбиране на събитие. Използвайте безкрайност или нула, за да посочите неограничен брой слушатели. По подразбиране можете да абонирате само десет слушатели за събитие. |
Можете да извиквате тези методи само на an EventEmitter инстанция.
Например:
myEmitter.removeListener("TestEvent");
Кодовият блок по-горе премахва един слушател за TestEvent събитие.
Значението на излъчвателите на събития
Node.js възприема парадигмата за програмиране, управлявано от събития, с поддръжката си за излъчватели и слушатели на събития. Програмирането, управлявано от събития, е една от причините Node.js програмите да са по-бързи и по-прости от някои алтернативи. Можете лесно да синхронизирате множество събития, което води до подобрена ефективност.