В Angular где подписаться в сервисе или в компоненте и почему? - PullRequest
0 голосов
/ 05 марта 2020

Этот вопрос очень часто встречается, некоторые предпочитают использовать в сервисе некоторые в компоненте:

Angular 2 подписаться на компонент или службу? : он говорит, что никогда не означает ручную подписку из компонента!

Если нам не нужны какие-либо данные, тогда зачем нам подписываться (в сервисе)? и когда будет отменена подписка?

Если мы подписываемся на компонент:

 this.serviceA.getMethodObservable().subscribe(data => {
      this.data = data;
 });

Примечание: подписка никогда не отписывается!

Если Наблюдение не может завершиться его собственный, тогда весь компонент, шаблон и все связанные объекты будут жить в памяти вечно.

Для этого мы используем

 // onDestroy: subject
 this.serviceA.getMethodObservable()
   .pipe(takeUntil(this.onDestroy))
   .subscribe(data => {
      this.data = data;
 });

 ngOnDestroy() {
    this.onDestroy.next();
 }

Это вопрос для подробного обсуждения и понимания плюсов и минусы любой подход! Итак, мой вопрос: КАКОЙ И ПОЧЕМУ?

1 Ответ

0 голосов
/ 06 марта 2020

Короче говоря:

  • Подписка на службу: не очень полезна, поскольку служба предназначена для хранения состояния, совместного использования этого состояния и уведомления об изменениях состояния. Служба не предназначена для реагирования на изменение состояния
  • Подписка в компоненте: небезопасно, когда Observable никогда не завершается, и вы не отписываетесь вручную в ngOnDestroy ловушке жизненного цикла
  • Позвольте платформе подписаться на вас (например: с async pipe). Безопасно, потому что нет риска зависания подписок, вызывающих утечки памяти. Вы по-прежнему можете использовать шаблон pipe d Observable и выполнять различные операции на уровне компонентов благодаря операторам rx js, не рискуя утечкой памяти (даже если обратные вызовы ссылаются на this)
...