Отмена подписки на наблюдаемое из-за утечки памяти - PullRequest
0 голосов
/ 19 октября 2018

У меня есть внутренний сервис, который возвращает некоторые данные, когда мы обращаемся к одной из его конечных точек, используя сервис HTTP.Теперь под углом, то, что мы делаем, это Observables.Мы subscribe до конечной точки.Примерно так

constructor(private http : Http){
}

ngOnInit(){
   this.http.get('/api/posts').subscribe(response => {
      // Store data into class variable
   })
}

Когда мы подписались на это.В разделе next подписки.У нас есть все данные, какие бы они ни были, через ответ.Теперь нет ничего, что могло бы отделиться от данных, которые мы получили, но все же многие люди говорят, что есть утечка памяти, если мы не отписываемся на нее.Мы обычно отписываемся в ngOnDestroy() методе жизненного цикла.Что я на самом деле хочу знать, так это то, что когда вызов уже завершен, мы получаем данные с сервера через ответ, и от него больше нечего получить.Тогда зачем нам это unsubscribe.Я хочу понять эту концепцию утечки памяти специально.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Когда вы вызываете подписку, она освобождает подписку в javascript, чтобы предоставить нам дескриптор обратного вызова события http-вызова, который позволяет нам отменить текущий http-вызов.Так как в этом случае вы не сохранили это в переменной, поэтому оно остается в памяти javascript анонимно, поскольку в будущем событии / обработчике предположим, что веб-сервису потребуется время для его выполнения, он не вернулся, но эта подписка осталась с компонентом, и в angular была ошибка, которая не приводит к автоматическомуотмените подписку на эти звонки, тогда эта подписка все еще будет зависать в комплекте javascript.Для получения дополнительной информации

https://github.com/angular/angular/issues/16261

0 голосов
/ 19 октября 2018

TL; DR; Нет, вам не нужно отказываться от подписки на вызовы http.

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

Существует множество способов отписаться, если вам нужен только один результат, вы можете добавить obs.pipe(first()), который автоматически завершится после получения первого результата.Вы также можете использовать канал async в angular, который автоматически подписывается и отменяет подписку при уничтожении компонента.

...