我正在使用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];
}
};
我将答案标记为正确,但我在我的代码中使用了上述内容,因为它在我的设计中效果更好。
答案 0 :(得分:58)
//To unsubscribe all listeners of an event
socket.off('event-name');
//to unsubscribe a certain listener
socket.off('event-name', listener);
请注意,socket.off
,socket.removeListener
,socket.removeAllListeners
,socket.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。