Подтвердить что ты не робот

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. Слушатель должен быть удален, если функция сокета работает даже.

Я ищу способ удалить конкретный прослушиватель, который действительно работает.

Этот ответ говорит, что removeListener не работает.

Есть ли недостаток, чтобы просто сделать это:

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

Я правильно ответил на ответ, но я использую это в своем коде, так как он работает лучше с моим дизайном.

4b9b3361

Ответ 1

Вам нужно передать функцию слушателя на 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);
}

Ответ 2

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

//to unsubscribe a certain listener
socket.off('event-name', listener);

Обратите внимание, что socket.off, socket.removeListener, socket.removeAllListeners, socket.removeEventListener являются синонимами.

Это проверено на socket.io v1.4.3

Ответ 3

Если вы не используете вызов функции, или даже если вы работаете со мной:

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

Вы можете даже пропустить все подключенные слушатели и удалить их.

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

Стоит отметить, что, хотя это работает, он работает только в Chrome на данный момент.