Je travaille sur une application Angular 8. Il est nécessaire d'actualiser automatiquement le composant toutes les 5 secondes. J'ai utilisé le code ci-dessous.
refresh.componenet.ts:
import { Observable, Subscription, interval } from 'rxjs'; . . listStudents$: Observable<StudentModel[]>; private updateSubscription: Subscription; constructor( private listStudentsService: ListStudentsService ) { } ngOnInit(): void{ this.GetStudentsBySubject(); } private GetStudentsBySubject() { this.updateSubscription = interval(5000).subscribe((val) => { this.listStudents$ = this.listStudentsService.getStudentsBySubject(this.subject); }); } ngOnDestroy() { this.updateSubscription.unsubscribe(); }
Le code ci-dessus fonctionne parfaitement et actualise le composant toutes les 5 secondes.
Le composant obtient la liste des étudiants dans ngOnInit ()
. Ensuite, il actualise les données toutes les 5 secondes. Mais le problème est que le composant attend 5 secondes pour charger les données pour la première fois également.
Comment puis-je définir conditionnellement l'actualisation automatique de ce composant pour qu'elle s'actualise toutes les 5 secondes sans attendre la première fois.
3 Réponses :
Vous pouvez utiliser la minuterie qui est une autre fonction de rxjs. Il est utilisé avec un délai initial et un point.
https: // www. learnrxjs.io/operators/creation/timer.html
this.updateSubscription = timer(0, 5000).subscribe((val) => { ...
il semble que l'opérateur du temps soit un raccourci vers ma réponse 😁, et plus propre 👍, bon
vous pouvez utiliser startWith
opérateur
import { startWith } from 'rxjs/operators'; private GetStudentsBySubject() { this.updateSubscription = interval(5000).pipe(startWith(0)).subscribe((val) => {... }); }
Les réponses précédentes fonctionnent toutes les deux, mais j'aimerais élaborer un peu plus.
Ce n'est pas une bonne idée de réaffecter vos listStudents $
en continu, car vous créerez des fuites de cette façon.
De plus, le membre de la classe updateSubscription
n'est pas nécessaire et vous donne beaucoup plus à penser lors du nettoyage.
import { Observable, Subscription, timer } from 'rxjs'; import { share , mergeMap } from 'rxjs/operators'; ... ... listStudents$: Observable<StudentModel[]>; constructor( private listStudentsService: ListStudentsService ) { } ngOnInit(): void{ this.listStudents$ = timer(0,5000).pipe( mergeMap(()=>this.listStudentsService.getStudentsBySubject(this.subject)), share(), ); } }
listStudents $
est maintenant une observable "chaude".
Merci. C'est exactement ce que je cherchais.