В этом руководстве вы узнаете о модуле событий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событие, используя методEventEmitteremit()объекта 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%
Заключение
- Модуль
eventsNode.js предоставляет вам классEventEmitter, который позволяет управлять событиями в приложении узла. - Используйте метод
on()объекта, чтобы зарегистрировать обработчик для события. - Используйте метод
EventEmitteremit()объекта EventEmitter для создания события.
