Как правило, ваши службы не должны быть уничтожены / отключены после того, как какой-либо компонент отключен из view / dom. Относитесь к ним как к коду для выполнения какого-либо преобразования или извлечения данных.
В: Почему все используют takeUntil(this.destroyed$)
или this.subscription.unsubscribe()
?
A: Observable
живет до тех пор, пока есть хотя бы один подписчик. Поэтому, если у вас есть некоторые долгоживущие наблюдаемые, которые не завершаются сразу после какого-либо действия, у вас будут утечки памяти (Angular может создавать / инициализировать каждый компонент несколько раз). Говоря о Angular
http
, все вызовы get
, post
, put
и delete
завершаются после выполнения внутреннего вызова. Это означает, что вам не нужно добавлять unsubscribe
в onDestroy
hook или использовать takeUntil
.
Если вы установили Websocket
соединение и прослушиваете некоторые сообщения, ваш поток становится длинным-последний и каждый компонент, который подписан на этот сообщения должен отписаться в течение цикла onDestroy
. Если вы этого не сделаете, Angular может инициализировать ваш компонент несколько раз (это обычно происходит с операторами *ngIf=""
), и несколько подписок создаются, но никогда не уничтожаются. Это приводит к утечке памяти.
К сожалению, это общая проблема для большинства проектов Angular, которую можно решить либо вручную unsubscribe
/ takeUntil
, либо с помощью канала async
, который автоматически выполняет unsubscribe
после уничтожения компонента.