RXJS - Angular - отписаться от Темы - PullRequest
0 голосов
/ 31 мая 2018

Как описано в этой теме , «официальное» решение для отказа от подписки на Observables в Angular 5+ в целом использует takeUntil.Все идет нормально.Мой вопрос: это также применимо, если наблюдаемая, на которую я подписан, действительно является Субъектом?

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Мне есть что добавить.Subject хранит подписчиков внутри (Observable тоже).Если Subject является частью вашего компонента (создается внутри, хранится как свойство или в закрытии), то субъект и его подписки - это сборщик мусора с самим компонентом.

Но это особый случай, и следуетбудьте очень осторожны с этим: все должно содержаться в компоненте.

Например, можно не отписаться от наблюдаемой FormControl.valueChanges, если она используется только в компоненте.

Но чтобы быть в безопасности и не думать об этом, просто используйте takeUntil.

0 голосов
/ 01 июня 2018

Как только вы звоните .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();

Быстрое суммирование , как обрабатывать отписки, любой из следующих методов:

  1. Превратить бесконечные наблюдаемые в конечные,устраняя необходимость отмены подписки (используйте .takeUntil(this.destroyed$) и this.destroyed$.emit() в ngOnDestroy()).
  2. Избегайте подписки и пропускайте наблюдаемое через async pipe.
  3. Сохраняйтессылка на любые подписки и вызов .unsubscribe() в методе ngOnDestroy().

Лично я склонен использовать только один из двух первых методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...