Модуль событий events в Node.js

В этом руководстве вы узнаете о модуле событий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 для создания события.
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript