web-dev-qa-db-ja.com

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');
}

emitTest関数を呼び出してからremoveListener関数を呼び出すと、'test complete'emitTestを再度呼び出したときのメッセージ。ソケット機能が機能する場合は、リスナーを削除する必要があります。

実際に動作するspecificリスナーを削除する方法を探しています。

この回答 はremoveListenerが機能しないことを示しています。

これを行うだけの欠点はありますか?

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

答えを正解としてマークしましたが、デザインでうまく機能するため、上記のコードで使用しています。

51
Houseman

リスナー関数を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);
}
46
Lyn Headley
//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でテストされています

68
Israfel

関数呼び出しを使用していない場合、またはあなたが私のために働いていた場合でも:

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

接続されているすべてのリスナーをループして削除することもできます。

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

これは機能しますが、現時点ではChromeでのみ機能します。

0
Tod