Как только вы звоните .subscribe()
по чему-либо (субъектам тоже), что-то должно гарантировать, что подписка будет отменена.
Работа с конечными наблюдаемыми : если вы подписываетесь на конечную наблюдаемую(имеется в виду наблюдаемое, имеющее конечную / ограниченную последовательность), последнее сообщение отправит сигнал завершения, и подписка будет автоматически отменена.Примеры этого:
Observable.of(100)
Observable.from([1,2,3,4])
Примеры в конечных наблюдаемых:
Observable.fromEvent(document, 'click')
Observable.timer(1000)
Вызов / передача .first()
, .take(number)
или .takeWhile(condition that will evaluate to false at some point)
или takeUntil(observable that emits a value)
на наблюдаемой все превратит бесконечную наблюдаемую в конечную.
Прекратите вызывать .subscribe () : Другой популярный метод отказа от отписки - это не подпискана первом месте.Это может звучать глупо, так как, когда вы хотите заметить заметки, на которые вы не подписаны?Хорошо, если вам нужно только передать некоторые данные в ваш шаблон view / html, передача этого наблюдаемого в асинхронный канал передаст проблему отказа от подписки в сам асинхронный канал.
Типичные примеры в шаблоне html:
<h1>Editing {{ infiniteObservable$ | async }}<h1>
<li *ngFor="let user of userObservable$ | async as users; index as i; first as isFirst">
{{i}}/{{users.length}}. {{user}} <span *ngIf="isFirst">default</span>
</li>
Отмена подписки вручную : Наконец, вы можете сохранить ссылки на все подписки.Вам не нужно хранить переменную, указывающую на каждую подписку, проще просто использовать один объект подписки, чтобы отслеживать все подписки, а затем отказаться от подписки на все сразу.Вот пример:
const subscriptions = new Subscription();
subscriptions.add(observable1$.subscribe());
subscriptions.add(observable2$.subscribe());
subscriptions.unsubscribe();
Быстрое суммирование , как обрабатывать отписки, любой из следующих методов:
- Превратить бесконечные наблюдаемые в конечные,устраняя необходимость отмены подписки (используйте
.takeUntil(this.destroyed$)
и this.destroyed$.emit()
в ngOnDestroy()
). - Избегайте подписки и пропускайте наблюдаемое через
async
pipe. - Сохраняйтессылка на любые подписки и вызов
.unsubscribe()
в методе ngOnDestroy()
.
Лично я склонен использовать только один из двух первых методов.