Latest web development tutorials

Node.js EventEmitter

Node.js все асинхронные операции ввода / вывода после завершения будет посылать событие в очередь событий.

Node.js, которые многие объекты распределены событие: распределенный объект net.Server событие каждый раз, когда новое соединение, а fs.readStream объекты будут выдаваться в случае, если файл открыт, когда. Все эти объекты генерируются события events.EventEmitter экземпляра.


EventEmitter класс

Модуль событий предоставляет только один объект: events.EventEmitter. Ядро EventEmitter это событие инициируется и слушателя событий функции пакета.

Вы можете ( "события") по требуют, чтобы получить доступ к модулю.

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter Если ошибка возникает при создании экземпляра объекта, это вызовет событие «ошибка». При добавлении нового слушателя, событие 'NewListener' срабатывает, когда слушатель удаляется, событие '' является удаления слушателя срабатывает.

Здесь мы используем простой пример показывает использование EventEmitter:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

Результаты исполнения заключаются в следующем:

Выполните этот код, через одну секунду после вывода на консоль'триггер some_event событие'.Принцип заключается в том, что объект зарегистрирован some_event событие событие слушателя, а затем мы посылаем события some_event по setTimeout 1000 миллисекунд после того, как события в объекте, а затем вызывает some_event слушателя.

$ node event.js 
some_event 事件触发

Каждое событие EventEmitter по названия события и ряда параметров, имя события является строка, как правило, выражаются определенные семантика. Для каждого события, EventEmitter поддерживает несколько прослушиватель событий.

Когда происходит событие, событие для регистрации слушателей событий последовательно называют в качестве аргумента параметра события обратного вызова.

Возьмем следующий пример иллюстрирует этот процесс:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

Выполнить код, указанный выше, выполните следующее:

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

В приведенном выше примере, эмиттер someEvent зарегистрировались для участия в мероприятии, два слушателя событий, а затем вызвал someEvent событие.

Операционные результаты можно увидеть в двух событий функции обратного вызова слушатель был вызван. Это самый простой EventEmitter использования.

EventEmitter предоставляет ряд атрибутов, таких , какна и испускают.на функция используется для привязкифункции события,испускают атрибут используется , чтобы вызвать событие. Далее мы рассмотрим EventEmitter специфические свойства описаны.

способ

Нет. Метод и описание
1 добавления слушателя (событие, слушатель)
Добавление слушателя для указанного слушателя событий до конца массива.
2 на (событие, слушатель)
Для получения указанного события, чтобы зарегистрировать слушателя принимает событие строки и функцию обратного вызова.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 один раз (событие, слушатель)
Зарегистрировать одного слушателя для указанного события, что большинство слушателей будет вызывать один раз, сразу же после освобождения спускового слушателя.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 удаления слушателя (событие, слушатель)
Удаляет указанное событие слушателя, слушатель должен быть событие имеет зарегистрированных слушателей.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([событие])
Удаляет все обработчики для всех событий, если указанное событие, удалить указанное событие для всех слушателей.
6 setMaxListeners (п)
По умолчанию, EventEmitters при добавлении более 10 слушателей будет выводить предупреждающее сообщение. Функция setMaxListeners используется для увеличения числа слушателей ограничений по умолчанию.
7 слушателей (событие)
Возвращает массив обработчиков для указанного события.
8 испускать (событие, [arg1], [arg2], [...])
Каждый параметров порядка выполнения слушателем, если есть зарегистрированный слушатель событий возвращает истину, в противном случае возвращает ложь.

методы класса

Нет. Метод и описание
1 listenerCount (эмиттер, событие)
Возвращает количество слушателей для указанного события.

событие

Нет. События и описание
1 NewListener
  • событие - строка название события

  • Слушатель - функция обработки событий

Событие срабатывает при добавлении нового слушателя.

2 удаления слушателя
  • событие - строка название события

  • Слушатель - функция обработки событий

Удаление слушателя из заданного массива слушателя. Обратите внимание, что это изменится в индексе является то, что слушатель после того, как слушатель удален.

примеров

Следующие примеры через соединение (соединение) событие демонстрирует EventEmitter приложений класса.

Создание main.js файл, следующим образом:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

Код выше, результаты выполнения следующим образом:

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

событие ошибки

EventEmitter определяет специальное событие ошибки, она содержит смысловую ошибку, мы, как правило, вызвать событие ошибки перед лицом исключений.

Когда срабатывает ошибка, EventEmitter предусматривают, что если нет ответа на слушателя, Node.js будет использовать его в качестве исключения, выхода из программы с сообщением об ошибке.

Чтобы настроить таргетинг мы обычно будут вызывать настройки слушателя событий ошибок, избежать ошибки, возникающие в процессе аварий программы. Например:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

Запуск отображается следующее сообщение об ошибке:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

Наследование EventEmitter

Большую часть времени мы не напрямую использовать EventEmitter, но унаследовал его в объекте. В том числе фс, сети, HTTP, в том числе, до тех пор, как основной поддержки реагирования на инциденты модули являются подклассами EventEmitter.

Почему? Есть две причины:

Во-первых, объект имеет функциональность физической реализации мероприятий, которые отвечают монитор выбросов и семантику, событие должно быть объектом.

Во-вторых, механизм объекта JavaScript является прототипом на основе нескольких частей наследования поддержка, объекты EventEmitter не нарушать первоначальный наследования.