Предположим, есть объекты, которые подписываются на сервер сокетов, например:
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;
Это помогло мне и в Угловых 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 (); Отказываться от подписки.