Баумгертнер Александр / Нетология
2016
Баумгертнер Александр / Нетология
Фронтендр разработчик Griddynamics
addEventListener
, jQuery.on
)
events
в Node.js. Класс EventEmitter
.
EventEmitter
Node.js
использующие EventEmitter
было:
let user_1, user_2, user_3, user_4, chatApplication;
/* ... */
chatApplication.send = function(message) {
// вызовы метода чтения у всех пользователей
// должны быть в коде метода `send`
user_1.read(message);
user_2.read(message);
user_3.read(message);
user_4.read(message);
};
стало:
chatApplication.on('send',
(message) => { user_1.read(message); }
);
// где-то в другом месте кода
chatApplication.on('send',
(message) => { user_2.read(message); }
);
// где-то в конце кода
chatApplication.on('send',
(message) => { user_4.read(message); }
);
let button = document.querySelector('.selector');
let clickHandler = function(e) { /* код обработчика */ };
// Подписаться на клик по кнопке
button.addEventListener('click', clickHandler);
// Отписаться от клика
button.removeEventListener('click', clickHandler);
$(document)
.on('ajaxSend', function() {
// показать лоадер
$('#loading').show();
})
.on('ajaxComplete', function() {
// скрыть лоадер
$('#loading').hide();
});
EventEmitter
Пример использования:
// В версиях до 4.0.0:
// require('events').EventEmitter
const EventEmitter = require('events');
// Создать объект-экземпляр (instance)
const myEmitter = new EventEmitter();
// Добавить обработчик _до_ вызова события
myEmitter.on('myEvent', (message) => { console.log(message) });
// Вызов (trigger) события
myEmitter.emit('myEvent', 'Привет, Мир!');
EventEmitter
on
, once
prependListener
, prependOnceListener
emit
eventNames
removeListener
, removeAllListeners
getMaxListeners
, setMaxListeners
on
Добавляет обработчик события, вызываемый каждый раз при событии.
Параметры (api):
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('myEvent', (data) => {
console.log(`Произошло событие myEvent, данные: ${data}`);
});
once
Тоже, что и emitter.on
, но обработчик события будет вызван один раз.
myEmitter.once('myEvent', (data) => {
console.log(`Произошло событие myEvent, ${data}`);
});
myEmitter.emit('myEvent', 'Привет, Мир!');
// console.log: Произошло событие myEvent, Привет, Мир!
myEmitter.emit('myEvent', 'Еще раз, Привет, Мир!');
// ничего не произойдет
prependListener
Тоже, что и emitter.on
, но добавляет обработчик перед остальными.
myEmitter.on('myEvent', (data) => {
console.log(`Произошло событие myEvent, сообщение: ${data.message}`);
});
myEmitter.prependListener('myEvent', () => {
console.log(`Последним добавлен — первым вызван`);
});
emitter.prependOnceListener
— обработчик вызывается один раз
emit
emitter.emit(eventName[, arg1][, arg2][, ...])
Вызывает событие eventName
,
можно передать данные arg1, arg2, ...
Параметры (api):
emit
, пример
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
/**
* {String} 'myEvent' — Имя события
* {*} 'Привет, Мир!' — Данные события
*/
myEmitter.emit('myEvent', 'Привет, Мир!');
emit('error')
Если не перехватить событие error
, то оно выбросит исключение,
которое остановит программу
emitter.emit('error');
// events.js:1
// throw err;
// ^
//
// log: Error: Uncaught, unspecified "error" event.
// Программа завершилась.
eventNames
Возвращает массив событий, для которых были добавлены обработчики.
myEmitter.on('myEvent_1', () => {});
myEmitter.on('myEvent_2', () => {});
console.log('eventNames: ', myEmitter.eventNames());
// log: eventNames: [ 'myEvent_1', 'myEvent_2' ]
removeListener
emitter.removeListener(eventName, listener)
Удаляет обработчик listener
события eventName
Параметры
eventName
— имя событияlistener
— обработчикremoveListener
, пример
// Обработчик нужно сохранить в переменную
let myListener = (message) => { console.log(message); };
// Добавить обработчик события `myEvent`
myEmitter.on('myEvent', myListener);
// Удалить обработчик события `myEvent`
myEmitter.removeListener('myEvent', myListener);
removeAllListeners
Удаляет все обработчики событий
myEmitter.on('myEvent_1', () => {});
myEmitter.on('myEvent_2', () => {});
myEmitter.on('myEvent_3', () => {});
myEmitter.removeAllListeners();
getMaxListeners
emitter.getMaxListeners()
Возвращает максимальное количество обработчиков, которое можно добавить к emitter
.
По умолчанию — 10.
При привышении количества — предупреждение в консоли.
Warning: Possible EventEmitter memory leak detected.
Use emitter.setMaxListeners() to increase limit.
Цель — экономия памяти и быстродействие.
setMaxListeners
emitter.setMaxListeners(n)
Устанавливает значение максимального количества обработчиков,
которое можно добавить к emitter
Параметры
n
— значение максимального количества обработчиковsetMaxListeners
, пример
myEmitter.setMaxListeners(3);
myEmitter.on('myEvent_1', () => {});
myEmitter.on('myEvent_1', () => {});
myEmitter.on('myEvent_1', () => {});
myEmitter.on('myEvent_1', () => {});
// Warning: Possible EventEmitter memory leak detected.
// 4 myEvent_1 listeners added.
// Use emitter.setMaxListeners()
// to increase limit
EventEmitter
"connect"
,
"response"
,
"abort"
"connection"
,
"error"
,
"listening"
,
"close"
"data"
,
"error"
,
"end"
,
"close"
"open"
,
"close"
Доработать chat.js
Полная ссылка: https://github.com/easy-deep-learning/event-emitter/blob/master/examples/app/chat.js
1.1 Добавить обработчик события message
для Чата Вебинара (webinarChat
),
который выводит в консоль сообщение 'Готовлюсь к ответу'.
Обработчик создать в отдельной функции.
1.2 Для вконтакте (vkChat
) установить максимальное
количество обработчиков событий, равное 2.
1.3 Добавить обработчик 'Готовлюсь к ответу' из пп. 1.1 к чату вконтакте.
Доработать chat.js
2.1 В классе чата ChatApp
добавить метод close
,
который будет вызывать событие close
(событие вызывается один раз, setInterval
как в констукторе, не нужен).
2.2 Для чата вконтакте (vkChat
) добавить обработчик close
,
выводящий в консоль текст "Чат вконтакте закрылся :(".
2.3 Вызывать у чата вконтакте метод close()
.
Доработать chat.js
Добавить код, который через 30 секунд отписывает chatOnMessage
от вебинара webinarChat
:).
Разбить существующий код на модули, запускаемый файл должен быть
index.js
или index.js
Способы предоставить домашнее задание в порядке приоритета:
Не смогу проверить и помочь если прислать: