socket.io Removing specific listener

I'm using Socket.io v0.9.16 and Chrome 34

I'm trying to remove a specific listener, or unsubscribe from a specific subscription

Something like this:

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

If I call the emitTest function, and then the removeListener function, I still see the 'test complete' message when I call emitTest again. The listener should have been removed, if the socket function even works.

I'm looking for a way to remove a specific listener that actually works.

This answer says that removeListener doesn't work.

Is there any downside to just doing this:

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

I marked an answer as correct, but I'm using the above in my code since it works better with my design.

76552 次浏览

You need to pass in the listener function to 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);

Note that socket.off, socket.removeListener, socket.removeAllListeners, socket.removeEventListener are synonyms.

This is tested on socket.io v1.4.3

If you're not using a function call, or even if you are the following worked for me:

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

You could even loop through all the listeners attached and remove them.

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

It's worth pointing out that although this works, it only works in Chrome at the moment.