Socket.io Suppression d'un auditeur spécifique

J'utilise Socket.io v0.9.16 et Chrome 34

J'essaie de supprimer un auditeur spécifique ou de m'abonner 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 message 'test complete' lorsque j'appelle emitTest nouveau. L'auditeur aurait dû être supprimé si la fonction socket fonctionne même.

Je cherche un moyen de supprimer un auditeur spécifique qui fonctionne réellement.

Cette réponse indique que removeListener ne fonctionne pas.

Y a-t-il un inconvénient à faire ceci:

 socket.removeListener=function(name){ if(socket.$events.hasOwnProperty(name)){ delete socket.$events[name]; } }; 

J'ai marqué une réponse comme correcte, mais j'utilise ce qui précède dans mon code car cela fonctionne mieux avec ma conception.

Vous devez passer dans la fonction d' removeListener pour 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 un appel de fonction, ou même si vous travaillez pour moi:

 getEventListeners(socket)['testComplete'][0].remove() 

Vous pouvez même parcourir tous les auditeurs attachés et les supprimer.

 for(var prop in getEventListeners(websocket)) { $(getEventListeners(websocket)[prop]).each(function() { this.remove()}) } 

Il vaut la peine de souligner que, bien que cela fonctionne, cela fonctionne uniquement dans Chrome en ce moment.