События в 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) | Шаблон архитектуры программного обеспечения, позволяющим создание, определение, потребление и реакцию на события. |
Ссылки
- Определение термина события - https://ru.wikipedia.org/wikii/Событие_(объектно-ориентированное_программирование)