Как отказаться от подписки на observable, если нет объекта типа «подписка»?

Если я подписываюсь на Observable, как я могу отказаться от подписки, если нет объекта типа «Подписка»?

Если у меня есть что-то вроде:

this.subscription = bla ... 

то я могу отписаться от него следующим образом (в методе ngOnDestroy ()):

this.subscription.unsubscribe();

Но что, если у меня будет что-то вроде этого:

 ngOnInit() {

    this.isLoggedIn$ = this.authService.isLoggedIn();

    this.isLoggedIn$.subscribe(res => {
      if (res) {
        this.isLoggedIn = true;
      } 
      else {
        this.isLoggedIn = false;
      }
    });

  }

Как мне отписаться от этого? Я вообще должен отказаться от подписки? Если нет, то почему?

Вот некоторая документация по Угловые наблюдаемые, с которой работает метод подписки. Что касается того, нужно ли вам отказываться от подписки, трудно сказать, не зная больше о том, что вы хотите сделать. Возможно, документы могут дать некоторое представление.

Turner Bass 10.08.2018 17:17
0
1
394
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Фактически вы предоставили здесь свой собственный ответ: bla ... - это ваш вызов this.isLoggedIn$.subscribe( ... ).

ngOnInit() {

  this.isLoggedIn$ = this.authService.isLoggedIn();

  this.subscription = this.isLoggedIn$.subscribe(res => {
    if (res) {
      this.isLoggedIn = true;
    } 
    else {
      this.isLoggedIn = false;
    }
  });

}

Просто проверьте, существует ли this.isLoggedIn $, прежде чем отказаться от подписки

ngOnDestroy() {
this.isLoggedIn$ && this.isLoggedIn$.unsubscribe();
}
Ответ принят как подходящий

Есть 3 способа отписаться от наблюдаемой

  1. Вы можете использовать вышеуказанный подход как this.subscription для назначения подписки для каждой подписки, а затем отписывайтесь от каждой явно. (Это следует избегать)

  2. Вы можете использовать канал takWhile, используя пример ниже:

    private isAlive = true;
    
    ngOnInit() {
    
      this.isLoggedIn$ = this.authService.isLoggedIn();
    
      this.subscription = this.isLoggedIn$
       .pipe(takeWhile(() => this.alive))
       .subscribe(res => {
        if (res) {
          this.isLoggedIn = true;
        } 
        else {
          this.isLoggedIn = false;
        }
      });
    
    }
    
    
    ngOnDestroy() {
       console.log('[takeWhile] ngOnDestory');
       this.alive = false;
    }
    
  3. Используйте оператор takeUntil:

    private unsubscribe: Subject<void> = new Subject();
    
    ngOnInit() {
    
      this.isLoggedIn$ = this.authService.isLoggedIn();
    
      this.subscription = this.isLoggedIn$
       .pipe(takeUntil(this.unsubscribe))
       .subscribe(res => {
        if (res) {
          this.isLoggedIn = true;
        } 
        else {
          this.isLoggedIn = false;
        }
      });
    }
    
    ngOnDestroy() {
      this.unsubscribe.next();
      this.unsubscribe.complete();
    }
    

Надеюсь, это помогло !!

Другие вопросы по теме