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?
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:
.interval()
crée un observable qui émet un événement toutes les 2 Minutes..timeInterval()
convertit un observable qui émet des éléments en un Qui émet des indications sur la durée écoulée entre ces émissions .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..subscribe()
enfin vous pouvez vous abonner aux donnéesSi 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))
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.
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();
OU utilisez ngx-take-Until-destroy
Observable.interval(60000)
.takeUntil(this.destroyed$)
.subscribe(() => {
// do something
});
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);