提问者:小点点

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函数,当我再次调用emitTest时,我仍然会看到'test完成'消息。如果套接字函数有效,侦听器应该已经被删除。

我正在寻找一种方法来删除一个实际有效的特定侦听器。

这个回答说removeListener不起作用。

这样做有什么不利之处吗:

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

我把一个答案标记为正确,但我在代码中使用了上面的内容,因为它更适合我的设计。


共3个答案

匿名用户

//To unsubscribe all listeners of an event
socket.off('event-name');

//to unsubscribe a certain listener
socket.off('event-name', listener);

请注意,socket.offsocket.removeListener套接字.removeAllListeners插座.removeEventListener是同义词。

这在socket.io v1.4.3上进行了测试

匿名用户

您需要将侦听器函数传递给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);
}

匿名用户

如果您不使用函数调用,或者即使您是以下人员,也为我工作:

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

您甚至可以循环浏览所有附加的侦听器并删除它们。

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

值得指出的是,虽然这是可行的,但目前只在Chrome中有效。