socket.io删除特定的侦听器

Hou*_*man 54 javascript sockets socket.io

我正在使用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');
}
Run Code Online (Sandbox Code Playgroud)

如果我调用该emitTest函数,然后调用该函数,我再次调用时removeListener仍会看到该'test complete'消息emitTest.如果套接字功能工作,则应该删除监听器.

我正在寻找一种方法来删除实际工作的特定侦听器.

这个答案说removeListener不起作用.

这样做是否有任何不利因素:

socket.removeListener=function(name){
        if(socket.$events.hasOwnProperty(name)){
            delete socket.$events[name];
        }
    };
Run Code Online (Sandbox Code Playgroud)

我将答案标记为正确,但我在我的代码中使用了上述代码,因为它对我的设计更有效.

Isr*_*fel 72

//To unsubscribe all listeners of an event
socket.off('event-name');

//to unsubscribe a certain listener
socket.off('event-name', listener);
Run Code Online (Sandbox Code Playgroud)

需要注意的是socket.off,socket.removeListener,socket.removeAllListeners,socket.removeEventListener是同义词.

这是在socket.io v1.4.3上测试的

  • 我正在使用socket.io 2.0.x,可以确认这对特定的侦听器有效,而无需指定特定的侦听器即可解除所有功能(包括匿名功能)的绑定。 (2认同)

Lyn*_*ley 47

您需要传入侦听器函数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);
}
Run Code Online (Sandbox Code Playgroud)