В этом руководстве вы узнаете о модуле событийevents
Node.js и о том, как он работает.
Node.js управляется событиями. Он опирается на модуль ядра events
для реализации архитектуры, управляемой событиями.
В модели, управляемой событиями, объект EventEmitter
вызывает событие, которое выполняет ранее подключенные прослушиватели события.
Объект EventEmitter
имеет две основные функции:
- Создание именованного события.
- Присоединение и отсоединение одного или нескольких прослушивателей событий от именованного события.
В Node.js многие основные модули наследуют класс EventEmitter
, включая модуль http
.
В следующем примере показано, как использовать модуль events:
- Во-первых, подключите модуль
events
с помощью функцииrequire()
:
const EventEmitter = require('events');
EventEmitter
— это класс, поэтому по соглашению его имя написано в регистре camel.
- Во-вторых, создайте новый экземпляр класса
EventEmitter
:
const emitter = new EventEmitter();
- В-третьих, прикрепите к событию один или несколько обработчиков событий с помощью метода
on()
:
emitter.on('saved', ) => { console.log(`A saved event occurred.`); });
В этом примере имя события saved
, а обработчик события — обратный вызов. Когда происходит saved
событие, обратный вызов вызывается автоматически.
- Наконец, сгенерируйте
saved
событие, используя методEventEmitter
emit()
объекта EventEmitter:
emitter.emit('saved');
Соединим все это вместе:
const EventEmitter = require('events'); const emitter = new EventEmitter(); emitter.on('saved',() => { console.log(`A saved event occurred.`); }); emitter.emit('saved');
Выход:
A saved event occurred.
Передача события с аргументами
При возникновении события вы можете захотеть передать некоторые данные обработчику событий, например, объект, который был сохранен при возникновении saved
события. В этом случае вы можете передать данные в метод emit()
в качестве второго аргумента. Например:
const EventEmitter = require('events'); const emitter = new EventEmitter(); emitter.on('saved', (arg) => { console.log(`A saved event occurred: name: ${arg.name}, id: ${arg.id}`); }); emitter.emit('saved', { id: 1, name: 'John Doe' });
Выход:
A saved event occurred, name: John Doe, id: 1
В этом примере, когда мы генерируем saved
событие, мы передаем объект, который имеет два свойства: id
и name
, методу emit()
. И когда событие происходит, мы показываем свойства объекта в консоли.
Отключение прослушивателей событий
Чтобы отсоединить прослушиватель событий от события, вы используете метод off()
объекта EventEmitter
. Например:
const EventEmitter = require('events'); const emitter = new EventEmitter(); // declare the event handler function log(arg) { console.log(`A saved event occurred, name: ${arg.name}, id: ${arg.id}`); } // attach the event listener to the saved event emitter.on('saved', log); // emit the saved event emitter.emit('saved', { id: 1, name: 'John Doe' }); // remove the event listener emitter.off('saved', log); // no effect emitter.emit('saved', { id: 2, name: 'Jane Doe' });
Выход:
A saved event occurred, name: John Doe, id: 1
В этом примере показано отключение прослушивателя событий от события. Прослушиватель событий не вызывается при создании saved
события.
Расширение класса EventEmitter
В следующем примере показано, как расширить класс EventEmitter
:
const EventEmitter = require('events'); class Stock extends EventEmitter { constructor(symbol, price) { super(); this._symbol = symbol; this._price = price; } set price(newPrice) { if (newPrice !== this._price) { this.emit('PriceChanged', { symbol: this._symbol, oldPrice: this._price, newPrice: newPrice, adjustment: ((newPrice - this._price) * 100 / this._price).toFixed(2) }); } } get price() { return this._price; } get symbol() { return this._symbol; } }
Как это работает.
- Класс
Stock
расширяет классEventEmitter
. Он имеет два свойства:symbol
иprice
. - Когда
price
изменяется, установщикprice
генерирует событиеPriceChanged
с объектом.
Ниже показано, как использовать класс Stock
:
const stock = new Stock('AAPL', 700); stock.on('PriceChanged',(arg) => { console.log(`The price of the stock ${arg.symbol} has changed ${arg.adjustment}%`); }) stock.price = 720;
Выход:
The price of the stock AAPL has changed 2.86%
Заключение
- Модуль
events
Node.js предоставляет вам классEventEmitter
, который позволяет управлять событиями в приложении узла. - Используйте метод
on()
объекта, чтобы зарегистрировать обработчик для события. - Используйте метод
EventEmitter
emit()
объекта EventEmitter для создания события.