с rxjs и angular, необходимо ли отписываться от подписок, которые происходят только один раз в методе onInit компонента приложения? - PullRequest
0 голосов
/ 08 ноября 2019

Поскольку ngOnInit вызывается только один раз в жизни приложения, когда я делаю подписку на наблюдаемое в ngOnInit, необходимо ли по-прежнему отписываться?

Возможно ли, что приложение создает утечку памяти длябраузер после закрытия приложения / вкладки?

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Краткие ответы:

1) Всегда

2) Да

Эта статья очень хорошо описывает, почему мы должны отписаться от всех наблюдаемыхи как сделать это эффективно в угловом формате.

Если вы подписываетесь на функцию ngOnInit, вы должны отказаться от подписки через ngOnDestroy.

Я обычно создаю unsubscribe Тема, и позвоните next() на него на ngOnDestroy. У меня были бы все мои подписки с takeUntil(unsubscribe).

Вот что я имею в виду:

unsubscribe = new Subject();

(...)

subscribeTo() {
   this.myService.getAll().pipe(
      takeUntil(this.unsubscribe),
    ).subscribe(data => this.localData = data);
}


ngOnDestroy() {
    this.unsubscribe.next();
    this.unsubscribe.complete();
  }
0 голосов
/ 08 ноября 2019

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

data$ = this.service.getData();

и в шаблоне

<ng-conatainer *ngIf="data$ | async as data">
  {{ data | json }}
</ng-conatainer>

Нет необходимости в каких-либо подписках.

0 голосов
/ 08 ноября 2019

Мой ответ ДА.

Если это произойдет только один раз в жизненном цикле OnInit, то достаточно использовать take(1).

Пример:

ngOnInit() {
   this.observableData$ = this.myService.getAll().pipe(take(1));
}

Преимущества:

  1. нет unsubscribe
  2. нет ngOnDestroy
  3. меньше кода, меньше ошибок

ОднакоЯ предложил вам другой способ обработки данных с помощью реактивного программирования в этой статье . Потому что subscribe получать данные не правильно. Мы просто используем subscribe, чтобы сделать обратный вызов для другого материала (не данных).

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