betacode

Руководство NodeJS EventEmitter

  1. NodeJS EventEmitter
  2. Пример EventEmitter
  3. EventEmitter Class

1. NodeJS EventEmitter

NodeJS идеально поддерживает события в приложениях. Каждое действие на компьютере называется событием (event). Например когда вы читаете файл на жестком диске, то значит вы должны выполнить 2 действия "открыть файл" и "закрыть файл" после завершения чтения. Таким образом здесь у нас есть 2 события "Открыть" & "Закрыть". Основываясь на событиях, вы вставляете ваши коды, чтобы сделать что-то.
var fs = require('fs');

// Create a stream to read file
var rs = fs.createReadStream('C:/test/demo.txt');

// The event 'open':
rs.on('open', function() {
    console.log('File opened!');
});
Module events предоставляет вам класс EventEmitter, это центральный класс в NodeJS поддерживающий определение события, регистрирующий Listener (Слушающий объект) данного события, и выдает (emit) событие.
Listener
В NodeJS, Listener является функцией, она будет вызвана для выполнения когда происходит событие. Возможно есть 0, 1 или более Listener привязанные (bind) к тому событию.
Для простоты, посмотрите на следующее изображение, 1 мышь и 1 мышеловка. Событие готовится произойти. Когда происходит событие (Наживка украдена), мышеловка сделает свое дело. Мышловкой здесь является "Listener", он будет работать когда появляется событие.

2. Пример EventEmitter

Импортировать module events, и объявить объект EventEmitter:
// Import events module
var events = require('events');


// Create an EventEmitter object
var eventEmitter = new events.EventEmitter();
Зарегистрировать Listener (Функции будут вызваны когда произойдет событие).
// Add Event Listener
eventEmitter.addListener('bellRing', bellRingHandler1);

// Add Event Listener
eventEmitter.addListener('bellRing', bellRingHandler2);
Выдать событие:
// Fire bellRing event!!
eventEmitter.emit('bellRing', 'Jerry');
first-example.js
// Import events module
var events = require('events');


// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// A Listener
var bellRingHandler1 = function bellRingHandler1(who) {
   console.log("\n");
   console.log('The Bell Ringing..... (Handler 1)');

   console.log(" " + who + " was standing behind the door!");
   if(who == 'Jerry') {
       console.log(' Tom, help me!!');
       return;
   }
   console.log(" Welcome " + who);
}

// A Listener
var bellRingHandler2 = function bellRingHandler2(who) {
   console.log("\n");
   console.log('The Bell Ringing..... (Handler 2)');

   eventEmitter.emit("nobodyIsAtHome");
}

// A Listener
var nobodyIsAtHomeHandler = function nobodyIsAtHomeHandler()  {
   console.log("\n");
   console.log(" Sorry, Nobody is at home now, Please leave your message!")
}


// Add Event Listeners
eventEmitter.addListener('bellRing', bellRingHandler1);
eventEmitter.addListener('bellRing', bellRingHandler2);

eventEmitter.addListener('nobodyIsAtHome', nobodyIsAtHomeHandler);

// ----- Testing ------

// Fire bellRing event!!
eventEmitter.emit('bellRing', 'Jerry');
Запуск примера:
node eventemitter-examples/first-example.js

3. EventEmitter Class

No
Метод
Описание
1
addListener(event, listener)

Добавить listener в конце массива listeners для определенных событий. Этот метод не проверяет был ли listener добавлен когда-либо, или нет.

2
on(event, listener)

Этот метод 100% похож на метод addListener.

3
once(event, listener)

Добавить listener в массив listeners определенного массива. Но этот listener вызывается только 1 раз при происхождении события. Потом он удаляется из массива.

4
removeListener(event, listener)

Удаляет listener из массива listeners определенного события. Если listener добавлен в данный массив много раз, чтобы удалить все эти listener вам нужно вызвать этот метод много раз.

5
removeAllListeners([event])

Удалить все listener, или удалить все listener определенного события.

6
setMaxListeners(n)

По умолчанию, EventEmitter распечатает предупреждение если будут добавлены более 10 listener в определенное событие. Это полезная настройка по умолчанию, которая помогает найти утечки памяти(memory leaks). Вы можете настроить другое число, или настроить как 0 для безлимита (unlimited).

7
listeners(event)

Возвращает массив listener определенному событию.

8
emit(event,
[arg1], [arg2], [...])

Поочередно выполняет listener в массиве, с параметрами. Возвращает true если массив иммет минимум один listener, и наоборот возвращает false.