Обработка событий (events) — это основа работы с Node.js. Практически все объекты в Node.js генерируют событий. В Node.js для работы с событиями есть специальный модуль events.
Мы можем назначить объекту обработчик события с помощью метода addListener(event, callback). Метод принимает два аргумента — имя и обработчик события. Имя события — это строка, обычно в camelCase-стиле, например, connection, message, messageBegin. А второй параметър (обработчик) — ето callback функция (функция обратного вызова). Но есть и короткая версия этого метода, это для тех разработчиков, которые привыкли к удобств jQuery. Для метода addListener() существует синоним — метод on().
Пример обработки событий с помощью метода on:
server.on("connection", () => { console.log("connected!"); });
У метода on() есть очень полезная модификация — once(). С помощью метода once() мы можем назначить однократный обработчик события.
server.once("connection", () => { console.log("first connection!"); });
Этот код (события) сработает только при первом соединение с сервером.
В Node.js мы можем с одним объектом связать сколько угодно обработчиков, но по умолчанию их количество ограничено 10. Это сделано для того, чтобы предотвратить утечки памяти. Но мы имеем возможность изменить максимальное количество с помощью метода setMaxListeners(n), где n — это требуемое максимальное допустимое количество обработчиков.
Так же мы можем посмотреть все обработчики объекта, которые связаны с конкретными событиями. Это можно сделать с помощью метода listeners, который возвращает массив обработчиков.
const http = require("http"); const server = http.createServer((req, res) => { }).listen(8080); function serverClose(){ server.close(); } server.on("connection", () => { console.log("Connected!"); }); server.on("connection", serverClose); console.log( server.listeners("connection") );
Результат:
[ [Function: connectionListener],
[Function],
[Function: serverClose] ]
Мы ожидали, что в консоле мы увидим два обработчиков, а мы видим три, откуда взялся первый обработчик? Всё просто, connectionListener автоматически создается методом http.createServer(), это родной обработчик объекта.
Мы можем удалить обработчик с помощью метода removeListener(event, callback).
server.removeListener("connection", () => { console.log("Удален!"); });
Метод emit(event, [args]) — этот метод позволяет назначенным обработчикам срабатывать, как если бы связанные событие случилось. То есть, мы можем создать обработчик события а потом с помощью этого метода вызвать обработчик.
server.on("myEventName", (userName) => { console.log(`Hello, ${userName}`); }); server.emit("myEventName", "John");
Метод emit() кроме имени обработчика может принимать необязательные параметры — список аргументов обработчика.
В Node.js мы можем создать собственные событие и обработать. Это можно сделать с помощью конструктора / класса EventEmitter.
Объект EventEmitter
EventEmitter — это основной объект, который реализует работу обработчиков событий в Node.js. Любой объект, который является источником событий, наследует от класса EventEmitter. Так же все методы, о которых мы говорили, принадлежат этому классу. С помощью этого объекта мы можем создать собственной событие.
const EventEmitter = require("events").EventEmitter; const myEventObject = new EventEmitter(); myEventObject.on("eventName", (userName) => { console.log(userName); }); myEventObject.emit("eventName", "John");
Комментарии