Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript socket.io删除特定侦听器_Javascript_Sockets_Socket.io - Fatal编程技术网

Javascript socket.io删除特定侦听器

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.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 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()})
}