Баумгертнер Александр / Нетология
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', 'Привет, Мир!');
EventEmitteron, onceprependListener, prependOnceListeneremiteventNamesremoveListener, removeAllListenersgetMaxListeners, setMaxListenersonДобавляет обработчик события, вызываемый каждый раз при событии.
Параметры (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 — обработчик вызывается один раз
emitemitter.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' ]
removeListeneremitter.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();
getMaxListenersemitter.getMaxListeners()
Возвращает максимальное количество обработчиков, которое можно добавить к emitter.
По умолчанию — 10.
При привышении количества — предупреждение в консоли.
Warning: Possible EventEmitter memory leak detected.
Use emitter.setMaxListeners() to increase limit.
Цель — экономия памяти и быстродействие.
setMaxListenersemitter.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
Способы предоставить домашнее задание в порядке приоритета:
Не смогу проверить и помочь если прислать: