События и модуль events¶
Для построения более гибкой и масштабируемой архитектуры приложения можно использовать Node.js события, которые представлены классом EventEmitter
встроенного модуля events
.
Перейдем сразу к примеру.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Генерация Node.js события осуществляется с помощью метода emit()
объекта экземпляра класса EventEmitter
, который первым аргументом принимает название события, а всеми необязательными остальными - передаваемые данные.
Обработчик регистрируется с использованием метода on()
, которому передается два параметра:
- имя Node.js события;
- callback-функция, принимающая в качестве параметров указанные в
emit()
данные.
Если в процессе генерации события произойдет ошибка, то Node.js самостоятельно инициирует возникновение события error
, и если для него не будет найден обработчик, то будет сгенерировано исключение.
Экземпляры EventEmitter¶
Обычно в приложении создаются несколько экземпляров класса EventEmitter
для логического разграничения типов Node.js событий.
app.js
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 26 |
|
Работа напрямую с базовым классом EventEmitter
будет регистрировать все обработчики глобально и при последующем создании нового экземпляра он унаследует все события базового класса. Поэтому работайте либо только с экземплярами, либо только с базовым классом.
EventEmitter API¶
Для однократного выполнения регистрируемого обработчика вместо метода on()
используйте once()
, который перед вызовом callback-функции удаляет его из памяти.
app.js
1 2 3 4 5 6 7 8 9 10 |
|
По умолчанию для каждого отдельного события можно максимально зарегистрировать 10 функций обработчиков. Чтобы снять это ограничение для всех событий всех созданных экземпляров, измените значение свойства EventEmitter.defaultMaxListeners
.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Чтобы изменить ограничение для отдельного экземпляра, используйте применительно к нему метод setMaxListeners()
.
1 2 3 |
|
В случае превышения максимального количества обработчиков Node.js события будет выдано предупреждение.
Чтобы узнать, сколько обрабатывающих функций уже зарегистрировано на конкретное событие, используйте метод EventEmitter.listenerCount()
, которому передаются два параметра:
- экземпляр
EventEmitter
, относительно которого было зарегистрировано событие; - имя события.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Получить все зарегистрированные события позволяет метод eventNames()
.
1 2 3 4 5 6 7 8 |
|
Для удаления определенного обработчика у отдельного события используйте метод removeListener()
, принимающий в качестве параметров имя Node.js события и сам обработчик.
1 2 3 4 5 6 7 8 9 10 |
|
Для удаления всех обработчиков события или сразу нескольких событий, используйте метод removeAllListeners()
, который принимает массив событий, обработчики которых необходимо удалить.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|