web-dev-qa-db-fra.com

Comment arrêter observable.timer dans Angular2

J'implémente les fonctions suivantes dans le composant Angular2:

export class MypageEditComponent {

  ngOnInit() {
    this.timer = Observable.timer(100, 100);
    this.timer.subscribe(t => {
      this.setFormData();
  }


  private setFormData() {
    this.editUserAcountType = this.authStore.registerInfo.account_type;
    this.editAddress = this.authStore.registerInfo.email;
    this.editUserName = this.authStore.registerInfo.username;
  }
}

Je veux arrêter la répétition de Observable.timer Une fois que la valeur est correctement stockée avec setFormData().

Mais ne sais pas comment, dites-moi s'il vous plaît.

20
xKxAxKx

Il y a fondamentalement deux manières:

  • appelez unsubscribe() sur l'objet d'abonnement renvoyé par l'appel subscribe().
  • utiliser un opérateur

Pour que unsubscribe vous puissiez le faire comme ceci.

ngOnInit() {
  this.subscription = timer(100, 100).subscribe(t => {
    this.setFormData();
  });
}

private setFormData() {
  ...
  this.subscription.unsubscribe();
}

Ou vous pouvez utiliser Subject pour compléter l’observable via l’opérateur takeUntil():

this.subject = new Subject();

ngOnInit() {
  timer(100, 100).pipe(
    takeUntil(this.subject),
  ).subscribe(t => this.setFormData());
}

private setFormData() {
  ...
  this.subject.next();
}

Jetez un coup d'oeil à ceux-ci aussi:

Jan 2019: Mise à jour pour RxJS 6

40
martin

vous pouvez utiliser la méthode unsubscribe lorsque vous souhaitez arrêter le chronomètre observable comme ceci

this.timer = Observable.timer(100, 100);
this.subscription = this.timer.subscribe(t => {
    this.setFormData();
});

.............
this.subscription.unsubscribe();
11
Pardeep Jain

Une nuance que les réponses précédentes n’ont pas vraiment abordée est qu’il n’est pas nécessaire d’arrêter un minuteur/intervalle observable - du moins pas en interagissant avec l’observable ou le minuteur lui-même.

Je me suis retrouvé ici parce que je configurais un observable à l'aide d'une minuterie dans la méthode de démarrage d'un serveur HostedService et que, dans la méthode d'arrêt, il semblait comme si je devais l'arrêter ou me débarrasser de quelque chose? - et bien non. La minuterie observable n'a pas besoin d'être arrêtée ou éliminée de cette manière, mais uniquement les abonnements, et c'est pourquoi ...

Les temporisateurs et les intervalles observables sont des exemples de flux froids (bien qu'ils semblent se comporter comme chaud). Ils sont passifs et non actifs, ils ne produisent pas de données tant qu’ils ne sont pas abonnés et cessent de produire des données sans abonnés. Par conséquent, la suppression de tous les abonnements devrait suffire à empêcher le chronomètre de produire des données.

Plus d'infos ici ... [ http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html]

1
controlbox