2016-08-19 5 views
0

Есть ли способ переопределить некоторые события сокета?переопределение событий сокетов (socketio)

Я хотел бы иметь возможность загрузить дополнительный модуль, который может заменить стандартный.

Что-то вроде этого

socket.on('someevent', function() { 
    //Optional modules actions 
}) 

socket.on('someevent', function() { 
    //Standardmodules actions 
}) 

Standardmodules действий не будет выполнено, так как там будет способ обнаружить, что уже какое-то действие устанавливается для «someevent» (дополнительные модули действий). Надеюсь, это ясно, любая идея, как это сделать?

ответ

1

Сокет socket.io наследует от объекта EventEmitter, и именно здесь начинается .on(). Таким образом, вы можете использовать различные методы на EventEmitter, чтобы узнать, какие обработчики событий установлены. Например, вы могли бы сделать:

socket.listeners('someevent') 

и он будет возвращать массив функций, которые установлены в качестве обработчиков событий для этого события.

Или, вы можете сделать:

socket.eventNames() 

и он возвращает массив имен событий, которые есть по крайней мере один обработчик.


eventEmitter не обеспечивает способ «переопределить» другой обработчик событий. Чтобы сделать это вручную, вы можете очистить предыдущий прослушиватель событий, а затем установить новый.

Например, вот функция коррекции:

EventEmitter.prototype.override = function(event, fn) { 
    this.removeAllListeners(event); 
    this.on(event, fn); 
} 

Таким образом, вы могли бы использовать это на сокете, как это:

socket.override('someevent', myHandler); 

Примечание: EventEmitters предназначены для поддержки многих слушателей, поэтому множество разных фрагментов кода могут контролировать один и тот же эмиттер. Таким образом, принудительное переопределение таким образом является своего рода грубым способом делать вещи и обычно не рекомендуется, поскольку это может непреднамеренно испортиться с другим кодом, контролирующим активность сокета. Было бы лучше просто удалить единственного слушателя, который вы хотите удалить, с помощью .removeListener(...).

+0

отличная статья. большое спасибо. –