Как отказаться от подписки на socket.io?

Предположим, есть объекты, которые подписываются на сервер сокетов, например:

socket.on ('news', obj.socketEvent )

Эти объекты имеют короткий срок жизни и часто создаются, генерируя множество подписок. Это похоже на утечку памяти и подверженную ошибкам ситуацию, которую можно интуитивно предотвратить следующим образом:

socket.off ('news', obj.socketEvent)

до удаления объекта, но, увы, нет метод off в сокете. Есть ли другой метод, предназначенный для этого?

Edit : не найдя ответа, я назначаю пустой метод для перезаписи метода оболочки для исходного обработчика событий, пример ниже.

var _blank = function(){};

var cbProxy = function(){
    obj.socketEvent.apply(obj, arguments)
};
var cbProxyProxy = function(){
    cbProxy.apply ({}, arguments)
}
socket.on('news', cbProxyProxy);

// ...and to unsubscribe 
cbProxy = _blank;
57
задан Bijou Trouvaille 14 March 2012 в 14:42
поделиться

1 ответ

Это помогло мне и в Угловых 8 и Реагирует 16.8:

receiveMessage() {
    let newCallback = (data) => {            
        this.eventEmitter.emit('add-message-response', data);
    };
    this.socket.on('add-message-response', newCallback);

    this.subscriptions.push({key: 'add-message-response', callback: newCallback});
}

receiveMessageRemoveSocketListener() {
    this.findAndRemoveSocketEventListener('add-message-response');
}

findAndRemoveSocketEventListener (eventKey) {
    let foundListener = this.subscriptions.find( (subscription) => subscription.key === eventKey );

    if(!foundListener) {
      return;
    } 

    this.socket.removeListener(foundListener.key, foundListener.callback);
    this.subscriptions = this.subscriptions.filter( (subscription) => subscription.key !== eventKey );
}

Причина использования Массива Подписок состоит в том, что, когда Вы Подписываетесь на событие многократно и Вы не удаляете отписавшуюся подписку из Подписного листа, Вы по всей вероятности будете правы в первый раз, когда Вы удаляете подписку из списка, но более поздние подписки не будут удалены, поскольку Вы будете находить первую инстанцию только каждым разом, когда Вы отказываетесь от подписки событие.

можно просто назвать receiveMessage (); подписываться на событие и receiveMessageRemoveSocketListener (); Отказываться от подписки.

0
ответ дан 24 November 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: