Генератор событий из одного класса запускает событие, которое могут прослушивать другие функции из других классов. Библиотеки предлагают реализации среды для публикации событий и их прослушивания.
На узле многие объекты могут излучать события.
Метод .on в генераторе событий —
Мы можем прослушивать эти события, вызывая один из этих объектов методом « on », передавая функцию обратного вызова. Файл ReadStream может генерировать событие « данные » каждый раз, когда есть данные, доступные для чтения.
Пример кода —
01
02
03
04
05
06
07
08
09
10
|
var fs = require( 'fs' ); // get the fs module var readStream = fs.createReadStream( '/etc/passwd' ); readStream.on( 'data' , function(data) { console.log(data); }); readStream.on( 'end' , function() { console.log( 'file ended' ); }); |
Здесь мы привязываемся к событиям « data » и « end » readStream, передавая функции обратного вызова для обработки каждого из этих случаев. Когда происходит одно из этих событий, readStream вызывает функцию обратного вызова.
Есть 2 способа сделать вышеуказанную операцию —
- Передать анонимную функцию
- Передайте имя функции для функции, доступной в текущей области, или переменную, содержащую функцию.
Метод .once —
Когда мы хотим, чтобы метод обратного вызова вызывался только один раз, мы используем это в нашей работе —
1
2
3
|
server.once( 'connection' , function (stream) { console.log( 'We have our first call!' ); }); |
Чтобы удалить все прослушиватели из текущего контекста, мы должны использовать функцию removeAllListeners.
Создание генератора событий —
Мы должны использовать пакет «events» в node.js.
Чтобы установить пакет событий, нам нужно выполнить —
1
|
npm install events |
в среде node.js.
Чтобы инициализировать пакет Event, нам нужно написать —
1
2
|
var EventEmitterVar = require( 'events' ).EventEmitter, util = require( 'util' ); |
Теперь для того, чтобы класс имел функцию генерирования событий, нам нужно наследовать это для класса, что делается в приведенном ниже исходном коде —
1
2
3
4
5
|
var exampleEventEmitterClass = function() { console.log( "The Class Constructor Example" ); } util.inherits(exampleEventEmitterClass, EventEmitterVar); |
util.inherits настроит цепочку прототипов так, чтобы методы прототипа EventEmitterVar были доступны в экземплярах exampleEventEmitterClass.
Таким образом, экземпляры exampleEventEmitterClass могут генерировать события:
1
2
3
4
5
|
exampleEventEmitterClass.prototype.emitMethod = function() { console.log( 'before the emitevent' ); this .emit( 'emittedevent' ); console.log( 'after the emitevent' ); } |
Здесь мы излучаем событие под названием «emittedevent».
Теперь клиенты экземпляров exampleEventEmitterClass могут прослушивать событие «emittedevent» следующим образом:
1
2
3
4
|
var evtEmitInstance = new exampleEventEmitterClass(); evtEmitInstance.on( 'emittedevent' , function() { console.log( 'We have got the functionality of Event Emitter' ); }); |
Здесь мы получили пользовательское событие из класса и работаем в этом событии.
Теперь, если мы вызываем метод —
1
|
evtEmitInstance.emitMethod(); |
emittedEvent будет вызван.
Выше приведено краткое введение Event Emitter в node.js. Мы напишем больше об этом в следующих постах.