В Angular это действительный способ проверить, открыта ли наблюдаемая подписка, прежде чем пытаться ее закрыть?

В Angular это действительный способ проверить, открыта ли наблюдаемая подписка, прежде чем пытаться ее закрыть? Кажется, он ведет себя правильно. То есть закрывает только открытые подписки. Мне интересно, есть ли более «правильный» способ сделать это в Angular.

import { Component, OnUpdate, OnDestroy } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { VoteService } from '../../services/vote.service';

export class Foo implements OnUpdate, OnDestroy {

  private voteSubscription;

  constructor(private afs: AngularFirestore,public voteService: VoteService) {}

  ngOnUpdate() {

    /* Lots of complicated things happen here which result in voteSubscription
       being opened and closed based on external conditions including but not
       limited to auth state. Bottom line is that sometimes the subscription
       is active and sometimes it's not. */

       if ( CONSTANTLY_CHANGING_INPUT_CONDITIONS ) {
          this.voteSubscription = this.voteService.getUserVotes().subscribe();
        } else {
          if (this.voteSubscription) {
            this.voteSubscription.unsubscribe();
          }
        }

  }

  ngOnDestroy() {

    /* Avoid producing a console error if we try to close a subscription that is
       already closed. */
    if (this.voteSubscription) {
      this.voteSubscription.unsubscribe();
    }

  }

}

Похоже, у вас проблемы не с закрытием отписки, а с неинициализированным свойством. Это так? Если да, то ваш вопрос следует перефразировать.

smnbbrv 25.08.2018 08:54
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
10
1
9 588
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Объект Подписка также имеет свойство закрыто, которое можно использовать, чтобы проверить, был ли поток уже отписан (завершен или произошла ошибка).

Поэтому, если вы хотите, вы можете использовать его также в операторе if:

if (this.voteSubscription && !this.voteSubscription.closed) 

Однако это не нужно, RxJs делает это внутренне за нас. Внутри метода отказа от подписки вы найдете что-то вроде:

if (this.closed) {
      return;
    }

Таким образом, можно смело вызывать отказ от подписки, не беспокоясь о том, что поток, возможно, уже был закрыт.

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

IonicMan 11.12.2020 13:57

Вы тоже можете использовать это:

import {Subscriber} from 'rxjs';

this.voteSubscription instanceof Subscriber // returns true if is a subscriber

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