我正在使用 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];
}
};
我把一个答案标记为正确,但我在代码中使用了上面的内容,因为它更适合我的设计。
//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
,套接字.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中有效。