События в Node.js

Цель

Мы посмотрим, как работать с событиями в Node.js.

Предварительныетребования

Знание основ JavaScript.

Установить Node.js и npm

Умение работать с модулями Node.js

Событие это

Событие — это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий.

События предназначены для того, чтобы иметь возможность предусмотреть реакцию программного обеспечения.

Для решения поставленной задачи создаются обработчики событий: как только программа попадает в заданное состояние, происходит событие, посылается сообщение, а обработчик перехватывает это сообщение. В общем случае в обработчик не передаётся ничего, либо передаётся ссылка на объект, инициировавший (породивший) обрабатываемое событие. В особых случаях в обработчик передаются значения некоторых переменных или ссылки на какие-то другие объекты, чтобы обработка данного события могла учесть контекст возникновения события.

Самое простое событие — это событие, сообщающее о начале или о завершении некоторой процедуры. Событие, по сути, сообщает об изменении состояния некоторого объекта. Наиболее наглядно события представлены в пользовательском интерфейсе, когда каждое действие пользователя порождает цепочку событий, которые, затем обрабатываются в приложении. [1]

Введение в события

Большая часть основного API-интерфейса Node.js построена вокруг асинхронной архитектуры, управляемой событиями, в которой определенные типы объектов (называемые «emitters») периодически генерируют события, вызывая при этом функции-обработчики («listeners»).

Все объекты, которые генерируют события, являются экземплярами класса EventEmitter. Эти объекты используют функцию emitter.on(eventName, listener), чтобы подключить обработчик одного или нескольких событий к объекту.

Когда объект EventEmitter генерирует событие, все обработчитки, связанные с этим конкретным событием, вызываются синхронно,то есть в том порядке, в котором были назначены (что отличает вызов событий в Node.js от вызова событий в браузере). Любые значения, возвращаемые вызываемыми слушателями, игнорируются и будут отброшены.

Для генерации событий используют метод emitter.emit(eventName[, ...args]), в который передается название события. Также в качестве второго параметра в функциюemit()можно передавать некоторый объект, который передается в функцию обработчика события.

Рассмотрим пример создания и обработки события.

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (req) => {
    console.log(req.data);
});
myEmitter.emit('event', {data: 'My event'});

В этом примере создается событие 'event' и к нему добавляется обработчик, который выводит данные, переданные в событие.

При вызови событие 'error' будет автоматически выбрасываться исключение, если не был подключен обработчик этого события.

С помощью метода emitter.once(eventName, listener), можно зарегистрировать обработчик событий, который вызывается всего один раз для конкретного события. После того, как событие генерируется, обработчик становится незарегистрированными, а затем вызывается.

По умолчанию, можно зарегистрировать максимум 10 обработчиков для любого отдельного события.

Это ограничение может быть изменено для отдельных экземпляров класса EventEmitter с использованием метода emitter.setMaxListeners(n). Чтобы изменить значение по умолчанию для всех экземпляров EventEmitter, может быть использовано свойство EventEmitter.defaultMaxListeners.

Соблюдайте осторожность при установке EventEmitter.defaultMaxListeners, поскольку это изменение влияет на все экземпляры класса EventEmitter, в том числе созданные до применения этого изменения . Тем не менее, вызов emitter.setMaxListeners(n) по-прежнему имеет больший приоритет над EventEmitter.defaultMaxListeners.

Обратите внимание, что это не жесткое ограничение. Экземпляр EventEmitter позволит добавление большего количества обработчиков, , но выдаст предупреждение о том, что возможна утечка памяти.

Для любого отдельного экземпляра EventEmitter, могут быть использованы методы emitter.getMaxListeners() и emitter.setMaxListeners(n) чтобы временно избежать этого предупреждения.

Для того чтобы удалить подписчика используется метод emitter.removeListener(eventName, listener).

Практическое задание

Сгенерируйте 2 события и добавте к каждому по 2-3 обработчика, при этом для одного с использование метода once(), а для второго on(). Посмотрите как отработает код.

Глоссарий

Термин Значение
Архитектура, управляемая событиями (англ. event-driven architecture) Шаблон архитектуры программного обеспечения, позволяющим создание, определение, потребление и реакцию на события.

Ссылки

  1. Определение термина события - https://ru.wikipedia.org/wikii/Событие_(объектно-ориентированное_программирование)

results matching ""

    No results matching ""