J'utilise Socket.io v0.9.16 et Chrome 34
J'essaie de supprimer un auditeur spécifique ou de vous désabonner d'un abonnement spécifique
Quelque chose comme ça:
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');
}
Si j'appelle la fonction emitTest
, puis la fonction removeListener
, je vois toujours le 'test complete'
message lorsque j'appelle emitTest
à nouveau. L'écouteur aurait dû être supprimé si la fonction socket fonctionnait même.
Je cherche un moyen de supprimer un écouteur spécifique qui fonctionne réellement.
Cette réponse indique que removeListener ne fonctionne pas.
Y a-t-il des inconvénients à simplement faire ceci:
socket.removeListener=function(name){
if(socket.$events.hasOwnProperty(name)){
delete socket.$events[name];
}
};
J'ai marqué une réponse comme étant correcte, mais j'utilise ce qui précède dans mon code car cela fonctionne mieux avec ma conception.
Vous devez passer la fonction d'écoute à 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);
}
//To unsubscribe all listeners of an event
socket.off('event-name');
//to unsubscribe a certain listener
socket.off('event-name', listener);
Notez que socket.off
, socket.removeListener
, socket.removeAllListeners
, socket.removeEventListener
sont des synonymes.
Ceci est testé sur socket.io v1.4.3
Si vous n'utilisez pas d'appel de fonction, ou même si vous êtes ce qui suit a fonctionné pour moi:
getEventListeners(socket)['testComplete'][0].remove()
Vous pouvez même parcourir tous les écouteurs attachés et les supprimer.
for(var prop in getEventListeners(websocket))
{
$(getEventListeners(websocket)[prop]).each(function() { this.remove()})
}
Cela vaut la peine de souligner que même si cela fonctionne, il ne fonctionne que dans Chrome pour le moment.