【问题标题】:socket.io Removing specific listenersocket.io 删除特定的监听器
【发布时间】:2014-05-30 07:59:50
【问题描述】:

我正在使用 Socket.io v0.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' 消息。监听器应该已经被移除了,如果套接字函数甚至可以工作的话。

我正在寻找一种方法来移除一个真正有效的特定监听器。

This answer 说 removeListener 不起作用。

这样做有什么缺点吗:

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

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

【问题讨论】:

    标签: javascript sockets socket.io


    【解决方案1】:
    //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 上测试的

    【讨论】:

    • 我正在使用 socket.io 2.0.x 并且可以确认这对特定的侦听器都有效,并且无需指定特定的侦听器即可取消绑定所有函数(包括匿名函数)。
    • 在 socket.io 2.3.0 中,如果我在没有第二个参数的情况下调用 socket.off() 事件(该参数必须是一个函数),则会引发错误。我想,我想删除的具体功能。
    • 我已经使用socket.removeAllListeners("news");在这个答案中找到了所有的事件监听器:stackoverflow.com/a/9696077/2691879
    • 我使用的是socket.io 2.3.0版本,通过io.on(eventName, (socket) => {...})获取socket对象时,服务器端没有定义off。但是,removeListener 在这种情况下工作得很好。
    【解决方案2】:

    需要将监听函数传入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);
    }
    

    【讨论】:

    • 为什么是两倍?你只需要引用你传入的函数。这是 Node 上所有 EventEmitter 的工作方式,也是浏览器库中的约定。如果您为给定事件注册了未知数量的处理程序并且需要将它们全部删除,我认为您的解决方案是明智的。
    【解决方案3】:

    如果你没有使用函数调用,或者即使你是以下为我工作的人:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 2016-12-25
      • 2012-08-25
      • 2018-05-13
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多