web-dev-qa-db-fra.com

Comment faire un appel http toutes les 2 minutes avec RXJS?

J'ai un service qui appellera mon service de repos toutes les 2 minutes. Sur mon service j'ai la fonction suivante

  getNotifications(token: string) {
     const body = 'xxxxxxxxx=' + token;
     return this.http.post('/rest/ssss/ddddddd/notificationcount', body, this.options)
          .map((res) => res.json());
  }

Sur mon composant, j'appelle ma fonction de service pour appeler l'API.

this.notificationService.getNotifications(this.token).subscribe((data) => {
  console.log(data);
});

Je souhaite passer cet appel toutes les 2 minutes. Quel est le meilleur moyen de le faire?

6
Ennio

Puisque vous utilisez déjà Observables, utilisez-le simplement :) Obersvable.interval() est votre bon ami ici:

Dans votre composant, procédez comme suit:

Observable
    .interval(2*60*1000)
    .timeInterval()
    .flatMap(() => this.notificationService.getNotifications(this.token))
    .subscribe(data => {
        console.log(data);
    });

Explication:

  1. .interval() crée un observable qui émet un événement toutes les 2 Minutes.
  2. .timeInterval() convertit un observable qui émet des éléments en un Qui émet des indications sur la durée écoulée entre ces émissions
  3. .flatMap() encapsule ensuite votre chaque} appel de service, Transforme les résultats en observable et le renvoie. Ceci garantit que votre appel de service à 0ème, 2ème, 4ème, 6ème minute ... est appelé de manière synchrone. (pensez qu’il y a beaucoup de .then()), c’est-à-dire que le service à la 2e minute ne sera appelé qu'après le 0e minute, et le 4e après le 2e, et ainsi de suite.
  4. .subscribe() enfin vous pouvez vous abonner aux données

Mettre à jour:

Si vous utilisez des opérateurs pipeables (rxjs5 et supérieur), dirigez simplement les opérateurs au lieu de les chaîner:

interval(2 * 60 * 1000)
    .pipe(
        flatMap(() => this.notificationService.getNotifications(this.token))
    )
    .subscribe(data => console.log(data))
23
CozyAzure

Si vous ne voulez pas faire un appel http et que vous voulez simplement faire quelque chose après 2 minutes, vous pouvez faire quelque chose comme ci-dessous.

 Observable.interval(2*60*1000)
  .subscribe(() => {
    // do something.
    // or callSomeMethod();
  });

Il y a une autre chose importante que vous voudriez faire. Vous devez détruire cette observation une fois que vous quittez votre page actuelle, car vous ne voulez pas que les calculs supplémentaires se déroulent derrière la scène quand ils ne sont pas réellement nécessaires. 

Il existe plusieurs options pour vous désabonner de cet observable. 

  1. Vous devez enregistrer la référence à l'observable et vous en désabonner dans la méthode onDestroy.

    this.observableRef = Observable.interval(60000)
    .subscribe(() => {
      // do something
     });
    
    // call this method in OnDestroy method of the page.
    this.observableRef.unsubscribe();
    
  2. OU utilisez ngx-take-Until-destroy

    Observable.interval(60000)
    .takeUntil(this.destroyed$)
    .subscribe(() => {
      //  do something
    });
    
0
Atif Saddique
import {Observable} from 'rxjs/Rx';

  Observable.interval(2 * 60 * 1000).subscribe(x => {
    callyourmethod();
  });

Mise à jour après commentaire

this.interval = setInterval(() => {
        this.yourservicecallmethod();
    }, 2 * 60 * 1000);
0
Rahul Singh