J'ai ce service en utilisant HttpClient pour obtenir des données:
checkData() {
return this.http.get('my url');
}
Le composant sur le pied de page que je l'appelle et affiche le résultat:
ngOnInit() {
this.myservice.checkdata().subscribe( result => { this.statustext = result } );
}
Cela fonctionne, mais j'ai besoin que cette méthode soit exécutée toutes les 10 secondes pour qu'elle soit à jour.
Comment puis-je faire ceci?
Utilisez la variable rxjs
pour appeler la demande d’API au démarrage, puis toutes les 10 secondes.
Ceci est mieux réalisé en utilisant rxjs pour diviser pour régner.
Tout d'abord, importez les éléments suivants:
import { timer, Observable, Subject } from 'rxjs';
import { switchMap, takeUntil, catchError } from 'rxjs/operators';
Ajoutez ensuite la propriété pour gérer la demande à l’API:
private fetchData$: Observable<string> = this.myservice.checkdata();
Ensuite, ajoutez la propriété pour gérer le minutage:
private refreshInterval$: Observable<string> = timer(0, 1000)
.pipe(
// This kills the request if the user closes the component
takeUntil(this.killTrigger),
// switchMap cancels the last request, if no response have been received since last tick
switchMap(() => this.fetchData$),
// catchError handles http throws
catchError(error => of('Error'))
);
Enfin, lancez la commande kill si le composant est tué:
ngOnDestroy(){
this.killTrigger.next();
}
Voici une démo StackBlitz .
Essayez avec timer
de RxJS:
import { Subscription, timer, pipe } from 'rjxs';
import { switchMap } from 'rxjs/operators';
subscription: Subscription;
statusText: string;
ngOnInit() {
this.subscription = timer(0, 10000).pipe(
switchMap(() => this.myservice.checkdata())
).subscribe(result => this.statustext = result);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
interval(10000)
de RxJS n’est pas approprié car il émettra des valeurs SEULEMENT après 10 secondes et pas immédiatement pour la première fois (et je pense que ce n’est pas ce que vous recherchez).
Cependant, timer(0, 10000)
, émettra des valeurs immédiatement (0) et toutes les 10 secondes (10000) jusqu'à la désinscription.
Dans votre méthode checkData, vous pouvez faire quelque chose comme ceci:
import { timer, of } from 'rxjs';
import { switchMap, catchError } from 'rxjs/operators';
checkData() {
return timer(0, 10000)
.pipe(
switchMap(_ => this.http.get('my url')),
catchError(error => of(`Bad request: ${error}`))
);
}
Ensuite, votre abonné recevra le résultat de l'appel http toutes les 10 secondes.
La manière de faire cela serait la suivante.
import { interval } from 'rxjs/observable/interval';
import { map } from 'rxjs/operators';
const timeInterval$ = interval(10000);
timeInterval$.pipe(
map( () => this.http.get(//some url);
);
J'espère que ceci vous aidera
export class YourComponent implements OnInit, OnDestroy {
private alive: boolean;
constructor(){}
ngOnInit(){
this.alive = true;
TimerObservable.create(0, 10000)
.pipe(
takeWhile(() => this.alive)
)
.subscribe(() => {
this.myservice.checkdata().subscribe( result => { this.statustext = result } );
});
}
ngOnDestroy(){
this.alive = false;
}
}