Node.js — обработка событий. Объект EventEmitter

Node.js — обработка событий. Объект EventEmitter
4.4 (88.57%) 7 votes

Обработка событий (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");

 


Об авторе

Занимаюсь программированием уже более 7 лет. Часто использую JavaScript (Node.js) и Python.

Комментарии