Введение и информация
http://nodejs.org/api/events.html
http://www.infoq.com/cn/articles/tyq-nodejs-event
События является наиболее важным модулем Node.js. Модуль Events предоставляет только событие объекта. Eventemitter. Основным ядром EventEmitter является прослушивание событий и прослушивание событий.
Большинство модулей в node.js унаследованы от модуля событий.
В отличие от событий на дереве DOM, не существует такой активности, как пузырька, слой по сложности.
EventEmitter поддерживает нескольких слушателей событий. Когда событие запускается, слушатель событий, зарегистрированный для этого события, вызывается последовательно, а параметры события передаются в виде параметров функции обратного вызова.
Как получить доступ:
Кода -копия выглядит следующим образом:
требуется ('события');
Emitter.on (событие, слушатель)
Кода -копия выглядит следующим образом:
/*
Позвоните модуль событий, чтобы получить объект Events.Eventemitter
*/
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
/*
EventEmitter.on (Event, Helliser) Зарегистрируйте слушателя для мероприятия
Параметр 1: Строка события, имя события
Параметр 2: Функция обратного вызова
*/
ee.on ('some_events', function (foo, bar) {
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
console.log ('первый раунд');
ee.emit ('some_events', 'wilson', 'Zhong');
console.log ('второй раунд');
ee.emit ('some_events', 'wilson', 'z');
Eventemitter.on (Event, Listener) Пример исходный код
Emitter.emit (Event, [arg1], [arg2], [...])
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
ee.on ('some_events', function (foo, bar) {
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.emit (Event, [arg1], [arg2], [...]) запускает указанное событие
Параметр 1: Строка события, имя события
Параметр 2: Необязательные параметры, передайте параметры функции обратного вызова в порядке
Возвратное значение: слушается ли это событие
*/
var issuccess = ee.emit ('some_events', 'wilson', 'Zhong');
ee.on ('some_events', function (foo, bar) {
console.log ("2 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
ee.emit ('some_events', 'Zhong', 'wei');
var issuccess2 = ee.emit ('oreth_events', 'wilson', 'Zhong');
console.log (issuccess);
console.log (issuccess2);
Emitter.emit (Event, [arg1], [arg2], [...]) Пример исходного кода
Пример выполнил три операции запуска событий, в которых некоторые_EVENTS регистрирует прослушивание, и функция EMIT вернет истину при вызове, в то время как other_events не регистрирует прослушивание, и функция EMIT вернет false, указывая на то, что событие не слушается; Конечно, вы можете игнорировать возвратную стоимость!
Emitter.once (событие, слушатель)
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
/*
EventEmitter.once (Event, Helliser) Зарегистрируйте единовременное прослушивание событий, удалите прослушивание после запуска один раз
Параметр 1: Строка события, имя события
Параметр 2: Функция обратного вызова
*/
ee.once ('some_events', function (foo, bar) {
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
console.log ('первый раунд');
ee.emit ('some_events', 'wilson', 'Zhong');
console.log ('второй раунд');
var issuccess = ee.emit ('some_events', 'wilson', 'Zhong');
console.log (issuccess);
Emitter.once (событие, слушатель) Пример исходный код
Из приведенных выше примеров результатов выполнения кода мы видим, что после регистрации прослушивателя для некоторого_EVENTS с Emitter.ONCE он запустит два раунда эмиттера вызовов, а второй раунд вернется false; Это означает, что регистрация слушателя с помощью Emitter.on немного отличается от регистрации слушателя с помощью Emitter.on, упомянутого ранее.
Emitter.Once Registration Alling Alling-это одноразовое слушание. При запуске один раз, слушание будет удалено! Конечно, это более очевидно от имени ^_ ^!
Emitter.removelistener (событие, слушатель)
Давайте сначала посмотрим на неудавшуюся сцену ~~~
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
ee.on ('some_events', function (foo, bar) {
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
/*
Когда я увидел метод удаления RemoveListener в API, я подумал, что это должно быть так
Но результат^_^!!!
*/
ee.removelistener ('some_events', function () {
console.log ('успешно удалил событие some_events слушание!');
});
console.log ('первый раунд');
ee.emit ('some_events', 'wilson', 'Zhong');
Emitter.Removelistener (событие, слушатель) сценарий сбоя исходного кода.
Когда я зарегистрировал слушателя для некоторого_EVENTS, используя eMitter.on, я использовал eMitter.removelistener, чтобы удалить слушателя некоторых_вентс, а затем назвал Emitter.emit, чтобы запустить. Наконец, я обнаружил, что это не продолжалось, как я себе представлял! Почему?
Я, естественно, думаю, что второй параметр emiiter.removelistener является функцией обратного вызова, поэтому API следует тщательно прочитать! ! !
Посмотрим еще одну успешную сцену ~~~
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
var listerer = function (foo, bar)
{
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
var stirlerer2 = function (foo, bar)
{
console.log ("2 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
var alluster3 = function (foo, bar)
{
console.log ("3 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', слушатель);
ee.on ('some_events', слушатель2);
ee.on ('some_events', слушатель3);
/*
Eventemitter.Removelistener (Event, Helliser) Удаляет слушателя для указанного события
Примечание: слушатель должен быть зарегистрирован
PS: После предыдущего примера он потерпит неудачу. Большая причина в том, что слушателя игнорируется. Естественно думать, что это нормально передать название события, так что это трагедия!
*/
ee.removelistener ('some_events, слушатель);
ee.removelistener ('some_events', слушатель3);
ee.emit ('some_events', 'wilson', 'Zhong');
Emitter.Removelistener (событие, слушатель) Пример успешного сценария исходный код
Я использовал метод примера написания, добавил трех слушателей в некоторых_вентсе, удалил первого и третьего слушателей и, наконец, запустил некоторые_венты с помощью eMitter.emit. Результат вывода нетрудно обнаружить, что первые и третьи слушатели удалили с помощью Emitter.Removelistener больше не работали.
Конечно, это вредно для людей. Оказывается, что второй параметр Emitter.Removelistener - это слушатель, который должен быть удален, а не функция обратного вызова после успешного удаления ...^_^!
Emitter.Removealllisteners ([Event])
Emitter.Removelistener был использован, но событие может иметь несколько слушателей. Когда все нужно удалить, это, очевидно, не приятный способ удалить их один за другим, и это не соответствует природе ленивого!
Давайте испытаем удобство, принесенное Emitter.Removealllisteners!
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
var listerer = function (foo, bar)
{
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
var stirlerer2 = function (foo, bar)
{
console.log ("2 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', слушатель);
ee.on ('some_events', слушатель2);
ee.on ('other_events', function (foo, bar)
{
console.log ("Другие события прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.Removealllisteners ([Event]) Удаляет (пакетное событие) все слушатели
Параметр 1: Необязательный параметр, строка события, имя события
*/
ee.removealllisteners ('some_events');
ee.emit ('some_events', 'wilson', 'Zhong');
ee.emit ('other_events', 'wilson', 'Zhong');
eMitter.removealllisteners Пример исходный код для входящего имени события Параметр
Глядя на приведенные выше результаты выполнения, вы обнаружите, что два слушателя были зарегистрированы для некоторых_вентов; Один слушатель был зарегистрирован для других_вентов; Я позвонил Emitter.Removealllisteners, чтобы передать имя события Some_events;
Наконец, используйте функцию eMitter.on, чтобы запустить два события: oce_events и другие. Наконец, обнаружено, что двух слушателей, зарегистрированных некоторыми, не существуют, в то время как слушатели, зарегистрированные другими_евальными, все еще существуют;
Это означает, что когда Emitter.Removealllisteners проходит с именем события в качестве параметра, все слушатели, которые проходят в названии события, будут удалены без влияния других слушателей событий!
Emitter.Removealllisteners можно использовать без параметров имени события; прямо выполнить
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
var listerer = function (foo, bar)
{
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
var stirlerer2 = function (foo, bar)
{
console.log ("2 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', слушатель);
ee.on ('some_events', слушатель2);
ee.on ('other_events', function (foo, bar)
{
console.log ("Другие события прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
/*
EventEmitter.Removealllisteners ([Event]) Удаляет (пакетное событие) все слушатели
Параметр 1: Необязательный параметр, строка события, имя события
*/
ee.removealllisteners ();
ee.emit ('some_events', 'wilson', 'Zhong');
ee.emit ('other_events', 'wilson', 'Zhong');
Emitter.Removealllisteners Образец исходный код без прохождения параметров
Пример кода почти такой же, как при прохождении в параметрах, за исключением того, что при вызове Emitter.Removealllisteners не передается указанное имя события;
Запуск результатов обнаружит, что некоторые слушатели и другие слушатели больше не существуют, и это удалит всех слушателей! (Следует использовать более жестокие методы с осторожностью ~~)
Emitter.listeners (Event)
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
var listerer = function (foo, bar)
{
console.log ("1 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
var stirlerer2 = function (foo, bar)
{
console.log ("2 -е событие прослушивания, параметр foo =" + foo + ", bar =" + bar);
}
ee.on ('some_events', слушатель);
ee.on ('some_events', слушатель2);
ee.on ('other_events', function (foo, bar)
{
console.log ("Другие события прослушивания, параметр foo =" + foo + ", bar =" + bar);
});
/*
EventeMitter.listeners (Event) // Возвращает массив прослушивания для указанного события
Параметр 1: Строка события, имя события
*/
var listeneReventSarr = ee.listeners ('some_events');
console.log (слушание
for (var i = slustereventSarr.length-1; i> = 0; i--) {
console.log (Слушайейсентсарр [i]);
};
Emitter.Listeners (Event) Пример исходного кода
Зарегистрируйте два прослушивателя для некоторого_EVENTS, Call Emitter.Listeners Function, пропустите имя события некоторых_ и получите значение возврата функции;
Из результатов мы видим, что возвратное значение получает коллекцию всех зарегистрированных прослушиваний для некоторого_EVENTS!
eMitter.setMaxListeners (n)
Это правда, что одно событие может добавить несколько слушателей, но каково максимальное значение Nodejs по умолчанию?
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
/*
Добавить 11 слушателей в EventEmitter
*/
для (var i = 10; i> = 0; i--) {
ee.on ('some_events', function ()
{
console.log ('th' +(i +1) +'слушатель');
});
};
Добавить N прослушивания исходных кодов исходных кодов
В приведенном выше примере я использовал цикл, чтобы добавить 11 прослушивания некоторых, выполнив код, и обнаружил, что появилась информация о предупреждении, и подсказка была более подробной, поэтому мне нужно использовать Emitter.SetMaxListeners (), чтобы увеличить предел.
Кода -копия выглядит следующим образом:
var EventEmitter = require ('events'). EventEmiter;
var ee = new Eventemiter ();
/*
EventEmitter.setMaxListeners (n) Установите максимальное прослушивание EventEmitter
Параметр 1: n Тип номера, максимальное количество слушателей
Когда будет более 10 слушателей, будет вызвано максимальное количество слушателей для EventEmitter:
(Узел) ПРЕДУПРЕЖДЕНИЕ: Возможная утечка памяти EventEmitter обнаружена. 11 слушателей добавлены.
Используйте eMitter.setMaxListeners () для увеличения предела.
Дизайнер считает, что слишком много слушателей могут привести к утечкам памяти, поэтому есть такое предупреждение
*/
ee.setmaxlisteners (15);
/*
Добавить 11 слушателей в EventEmitter
*/
для (var i = 10; i> = 0; i--) {
ee.on ('some_events', function ()
{
console.log ('th' +(i +1) +'слушатель');
});
};
Emitter.SetMaxListeners Пример исходного кода
Когда я называю Emitter.SetMaxListeners для прохождения 15, код выполняется, и информация о предупреждении больше не появляется;
Функция eMitter.setMaxListeners заключается в том, чтобы установить максимальное количество слушателей для EventEmitter. Такое ощущение, что вам не нужно устанавливать это значение. Должно быть меньше случаев, когда 10 недостаточно!
Дизайнер думал, что слишком много слушателей вызовут утечки памяти, поэтому он предупредил!
другой...
Я не буду вдаваться в подробности, если я использую меньше
EventeMitter.defaultmaxListeners
Функция EventEmitter.defaultmaxListeners аналогична SetMaxListeners.
Установите максимальное прослушивание для всех Eventemitters
Приоритет SetMaxListeners больше, чем DefaultMaxListeners
EventeMitter.listenerCount (Emitter, Event)
Возвращает количество слушателей для указанного события
Ошибка специального события
Цитата из Node.js Руководство по разработке: EventEmitter определяет специальную ошибку события, которая содержит семантику «ошибки». Мы обычно излучаем событие ошибки при столкновении с исключениями. Когда испускается ошибка, EventEmitter указывает, что если нет прослушивателя ответов, node.js рассматривает ее как исключение, выйти из программы и распечатать стек вызовов. Как правило, нам нужно настроить слушателей для объектов, которые будут издавать события ошибок, чтобы избежать сбоя всей программы после возникновения ошибок.
Наследство событий
Давайте поговорим об этом позже в Util. Если вам интересно, вы можете проверить это самостоятельно http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor