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 } }); }
3 Réponses :
Enregistrez une référence à votre abonnement dans votre classe avec De cette façon, vous êtes Cann Cal this.sub = intervalle [...]. S'abonner () Code>. p>
this.sub.subscribe () code> dans votre deuxième fonction. P>
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(); } }
J'ai essayé cette solution mais je continue à obtenir ceci: tapez 'Observable
Vous devez avoir assigné votre champ d'intervalle $ juste après votre do () code>, qui est observable. Pour pouvoir vous désabonner, vous devez attribuer le résultat de votre
S'abonner () Code> 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
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(...);
}