Функционал Node.js в основном применяет асинхронную событийную архитектуру, которая использует специальные объекты-эмиттеры для генерации различных событий, которые обрабатываются специальными функциями-обработчиками или слушателями событий. Все объекты, которые генерируют события, представляют экземпляры класса EventEmitter.
Класс EventEmitter определяется и предоставляется модулем событий, для подключения которого необходимо использовать require() или import:
1 2 3 |
const EventEmitter = require('events'); // или import "events"; |
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// импортируем нужный функционал import Emitter from "events"; let emitter = new Emitter(); // определяем событие let eventName_1 = "greet"; let eventName_2 = "greeting"; // добавляем функцию-обработчик для события с именем eventName_1 emitter.on(eventName_1, function () { console.log("Hello all!"); }); // добавляем несколько функций-обработчиков в массив обработчиков для события с именем eventName_2 emitter.on(eventName_2, function () { console.log("Привет!"); }); emitter.on(eventName_2, function () { console.log("Повторный привет!"); }); // Синхронный вызов каждого из слушателей, зарегистрированных для события с именем eventName_id, в том порядке, в котором они были зарегистрированы emitter.emit(eventName_1); // "Hello all!" emitter.emit(eventName_2); // "Привет! Повторный привет!" |
С помощью функции eventEmitter.on() к определенному событию по имени цепляется функция-обработчик. Причем для одного события можно указать множество обработчиков, которые помещаются в массив обработчиков для этого события. Метод emitter.emit(eventName[, ...args]) синхронно вызывает каждого из слушателей, зарегистрированных для события с именем eventName, в том порядке, в котором они были зарегистрированы, передавая каждому предоставленные аргументы.
При вызове события в качестве второго параметра в метод emitter.emit(eventName[, ...args]) можно передавать аргументы, которые передаются в функцию обработчика события, например:
1 2 3 4 5 |
emitter.on(eventName, function (data) { console.log("Повторный привет!" + data); }); emitter.emit(eventName, "цифра"); // "Повторный привет! цифра" |
Наследование от EventEmitter
В приложении мы можем оперировать сложными объектами, для которых также можно определять события, но для этого их надо связать с объектом EventEmitter. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// импортируем нужный функционал import Emitter from "events"; // наследуем функционал Emitter с помощью extends class User extends Emitter { sayHi(data) { // вызываеv каждого из слушателей, зарегистрированных для события с именем eventName this.emit(eventName, data); } } // определяем событие let eventName = "greet"; // создаем экземпляр класса User let myUser = new User(); // добавляем к объекту myUser обработку события "greet" myUser.on(eventName, function (data) { console.log(data); }); // вызываем метод объекта myUser, который в свою очередь вызывает слушатели события eventName myUser.sayHi("Говорю привет..."); |