Socket.io Удаление конкретного слушателя
Я использую Socket.io v0.9.16 и
Chrome 34
Я пытаюсь удалить конкретного слушателя или отказаться от подписки на определенную подписку
Что-то вроде этого:
socket.on('testComplete',function(data){
console.log('test complete',data);
});
function emitTest(){
console.log('emitting test');
socket.emit('test','first emit');
}
function removeListener(){
socket.removeListener('testComplete');
}
Если я вызываю функцию emitTest
, а затем функцию removeListener
, я все еще вижу сообщение 'test complete'
, когда я снова вызываю emitTest
. Слушатель должен быть удален, если функция сокета работает даже.
Я ищу способ удалить конкретный прослушиватель, который действительно работает.
Этот ответ говорит, что removeListener не работает.
Есть ли недостаток, чтобы просто сделать это:
socket.removeListener=function(name){
if(socket.$events.hasOwnProperty(name)){
delete socket.$events[name];
}
};
Я правильно ответил на ответ, но я использую это в своем коде, так как он работает лучше с моим дизайном.
Ответы
Ответ 1
Вам нужно передать функцию слушателя на removeListener
.
function testFun(data){
console.log('test complete',data);
}
socket.on('testComplete', testFun);
function emitTest(){
console.log('emitting test');
socket.emit('test','first emit');
}
function removeListener(){
socket.removeListener('testComplete', testFun);
}
Ответ 2
//To unsubscribe all listeners of an event
socket.off('event-name');
//to unsubscribe a certain listener
socket.off('event-name', listener);
Обратите внимание, что socket.off
, socket.removeListener
, socket.removeAllListeners
, socket.removeEventListener
являются синонимами.
Это проверено на socket.io v1.4.3
Ответ 3
Если вы не используете вызов функции, или даже если вы работаете со мной:
getEventListeners(socket)['testComplete'][0].remove()
Вы можете даже пропустить все подключенные слушатели и удалить их.
for(var prop in getEventListeners(websocket))
{
$(getEventListeners(websocket)[prop]).each(function() { this.remove()})
}
Стоит отметить, что, хотя это работает, он работает только в Chrome на данный момент.