События и модуль 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 | |