socket.io Specifieke luisteraar verwijderen

Ik gebruik Socket.io v0.9.16 en
Chroom 34

Ik probeer een specifieke luisteraar te verwijderen of me af te melden voor een specifiek abonnement

Zoiets:

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');
}

Als ik de functie emitTesten vervolgens de functie removeListeneraanroep, zie ik nog steeds het bericht 'test complete'wanneer ik emitTestopnieuw. De luisteraar had verwijderd moeten zijn, als de socket-functie zelfs maar werkt.

Ik ben op zoek naar een manier om een ​​specifiekeluisteraar te verwijderen die echt werkt.

Dit antwoordzegt dat removeListener niet werkt .

Is er een nadeel om dit gewoon te doen:

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

Ik heb een antwoord als correct gemarkeerd, maar ik gebruik het bovenstaande in mijn code omdat het beter past bij mijn ontwerp.


Antwoord 1, autoriteit 100%

//To unsubscribe all listeners of an event
socket.off('event-name');
//to unsubscribe a certain listener
socket.off('event-name', listener);

Merk op dat socket.off, socket.removeListener, socket.removeAllListeners, socket.removeEventListenersynoniemen zijn .

Dit is getest op socket.io v1.4.3


Antwoord 2, autoriteit 43%

Je moet de listener-functie doorgeven aan 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);
}

Antwoord 3

Als je geen functieaanroep gebruikt, of zelfs als je het volgende voor mij hebt gewerkt:

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

Je zou zelfs door alle aangesloten luisteraars kunnen bladeren en ze kunnen verwijderen.

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

Het is de moeite waard erop te wijzen dat hoewel dit werkt, het momenteel alleen in Chrome werkt.

Other episodes