суббота, 13 июля 2013 г.

Ивентэмитер в NodeJs

events.EventEmitter
Класс который реализует событийную модель в ноде
var EventEmitter = require('events').EventEmitter; 
 
var ee = new EventEmitter;
 
ee.on('myevent', function(data) {});
ee.emit('myevent', {some: "data"});

//маленькая тонкость

ee.emit('error');//это свалит скрипт, если не будет подписки на событие с названием error, такая реализация только для события с этим названием

Есть несколько отличий между событийными моделями ноды и браузеров:

1) В ноде обработчики срабатывают в строгом порядке, в котором они были подписаны. В браузере в произвольном.
2) В браузере нет способа получить обработчики подписанные на обьект. В ноде есть
emitter.listeners(event);


В ноде есть у EventEmitter ограничение на количество обработчиков, которые можно подключать на конкретное событие, по-умолчанию == 10. Если количество начинает превышать нод бросает в поток вывода предупреждение о том, что возможны утечки памяти.

Иногда это ограничение нужно эмитеру нужно отключать, но нужно быть внимательным, и проследить чтобы краткоживущие обьекты не сохраняли ссылки на долгоживущий эмитер, а то утечка нам обеспечена.

Для диагностики таких проблем нам в помощь:
1) process.memoryUsage().heapUsed
2) модуль heapdump. Его дампы можно просматривать с помощью Google Chrome.

Комментариев нет:

Отправить комментарий