Javascript socket.io删除特定侦听器
我正在使用Socket.iov0.9.16和 铬34 我正在尝试删除特定的侦听器,或取消订阅特定的订阅 大概是这样的:Javascript socket.io删除特定侦听器,javascript,sockets,socket.io,Javascript,Sockets,Socket.io,我正在使用Socket.iov0.9.16和 铬34 我正在尝试删除特定的侦听器,或取消订阅特定的订阅 大概是这样的: socket.on('testComplete',function(data){ console.log('test complete',data); }); function emitTest(){ console.log('emitting test'); socket.emit('test','first emit'); } function
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 complete'
消息。如果套接字函数能够正常工作,那么侦听器应该被删除
我正在寻找一种方法来删除一个实际有效的特定侦听器
说removeListener不起作用
这样做有什么坏处吗:
socket.removeListener=function(name){
if(socket.$events.hasOwnProperty(name)){
delete socket.$events[name];
}
};
我将答案标记为正确,但我在代码中使用了上述选项,因为它更适合我的设计。您需要将侦听器函数传递到
RemovelListener
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);
}
请注意,socket.off
,socket.removeListener
,socket.removeAllListeners
,socket.removeEventListener
是同义词
如果您没有使用函数调用,或者即使您为我工作了以下各项,这将在socket.io v1.4.3上进行测试:
getEventListeners(socket)['testComplete'][0].remove()
您甚至可以遍历所有附加的侦听器并删除它们
for(var prop in getEventListeners(websocket))
{
$(getEventListeners(websocket)[prop]).each(function() { this.remove()})
}
值得一提的是,尽管这是可行的,但目前它只在Chrome中有效 为什么要增加两倍?您只需要有一个对传入函数的引用。这是节点上所有EventEmitter的工作方式,也是浏览器库中的惯例。如果您为给定事件注册了未知数量的处理程序,并且需要将其全部删除,我认为您的解决方案是合理的。我使用的是socket.io 2.0.x,可以确认这对特定的侦听器都有效,并且无需指定特定的侦听器即可解除所有函数(包括匿名函数)的绑定。使用socket.io 2.3.0,如果在没有第二个参数的情况下调用socket.off()事件,则会抛出一个错误,该参数必须是函数。我想,我要删除的特定函数。我已经使用
socket.removeAllListeners(“news”)成功删除了所有事件侦听器代码>在这个答案中找到:我使用的是socket.io版本2.3.0,当通过io.on(eventName,(socket)=>{…})获取套接字对象时,服务器端没有定义off
。但是,removeListener
在这种情况下工作得很好。
for(var prop in getEventListeners(websocket))
{
$(getEventListeners(websocket)[prop]).each(function() { this.remove()})
}