-1
votes

Comment puis-je m'abonner et se désabonner d'un observable?

J'ai deux fonctions où j'ai besoin de souscrire à un observable dans le premier et de me désabonner à la seconde. Mais dans mon code, je ne peux pas accéder à l'observable de la deuxième fonction car ce n'est pas dans sa portée.

Voici mes fonctions: P>

 start() {
    this.max = this.duration;
    const interval = Observable.interval(this.selectedSprint.duration);
    interval
      .takeWhile(_ => !this.isFinished)
      .do(i => this.current += 1)
      .subscribe();
    }

    stop() {
    // here I need to unsybscribe to the observable
    this.dialogService.openConfirmDialog('do you want to stop ?')
      .afterClosed().subscribe((result: boolean) => {
        if (result) {
    // if true logic
        }
      });
      }


0 commentaires

3 Réponses :


2
votes

Enregistrez une référence à votre abonnement dans votre classe avec this.sub = intervalle [...]. S'abonner () .

De cette façon, vous êtes Cann Cal this.sub.subscribe () dans votre deuxième fonction.


0 commentaires

2
votes

Une solution consiste à stocker l'abonnement dans votre composant.

export class Component {
  intervalSub$: Subscription;
  intervalObs: Observable<number>;

  start() {
    this.max = this.duration;
    this.intervalObs$ = Observable.interval(this.selectedSprint.duration)
      .takeWhile(_ => !this.isFinished)
      .do(i => this.current += 1);
   this.intervalSub$ = intervalObs.subscribe();
  }

  stop() {
    // here I need to unsybscribe to the observable
    this.dialogService.openConfirmDialog('do you want to stop ?')
      .afterClosed().subscribe((result: boolean) => {
        if (result) {
          this.intervalSub$.unsubscribe();
        }
    });
  }
  /**
   * If you unsubscribed from the interval and you want to resume
   * (If this.isFinished is true, it won't do a thing)
   */
  resume() {
    this.intervalObs.subscribe();
  }
}


6 commentaires

J'ai essayé cette solution mais je continue à obtenir ceci: tapez 'Observable ' manque les propriétés suivantes à partir de type 'abonnement': fermé, ajouter, supprimer, désabonnement TS (2739)


Vous devez avoir assigné votre champ d'intervalle $ juste après votre do () , qui est observable. Pour pouvoir vous désabonner, vous devez attribuer le résultat de votre S'abonner () dans ce champ.


Une seule question, puis-je y souscrire à nouveau après la désabonnement? Si (! Résultat)


Oui, mais pour le faire, vous auriez besoin de stocker l'abonnement et l'observable => Vous pouvez souscrire à un observable et à vous désabonner d'un abonnement.


Ok, merci, pouvez-vous me montrer un exemple de cela?


Merci beaucoup



0
votes

Si vous êtes dans une classe, vous pouvez conserver l'objet code> code>, renvoyé par l'appel sur .Subscribe () code>, en tant que propriété.

stop() {
    this.intervalSubscription.unsubscribe(...);
}


0 commentaires