socket.io删除特定的侦听器

时间:2014-04-15 19:24:11

标签: javascript sockets 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功能,我再次拨打'test complete'时仍会看到emitTest消息。如果套接字功能工作,则应该删除监听器。

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

This answer表示removeListener不起作用。

这样做有什么缺点:

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

我将答案标记为正确,但我在我的代码中使用了上述内容,因为它在我的设计中效果更好。

3 个答案:

答案 0 :(得分:58)

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

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

请注意,socket.offsocket.removeListenersocket.removeAllListenerssocket.removeEventListener是同义词。

这是在socket.io v1.4.3

上测试的

答案 1 :(得分:43)

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

答案 2 :(得分:0)

如果您没有使用功能调用,或者即使您是以下为我工作的话:

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

您甚至可以遍历所有附加的侦听器并将其删除。

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

值得指出的是,尽管这有效,但它目前仅适用于Chrome。