je veux créer un observable qui gère ces derniers:
Ma fonction actuelle:
getData (): Observable<CurrentData> {
return interval(5000)
.pipe(
flatMap(() => "HTTP REQUEST",
),
map(this.extractData, this))
}
mais ma fonction n'attend pas la réponse réussie, ma fonction essaie la requête toutes les 5 secondes.
3 Réponses :
Vous pouvez essayer ce qui suit. Commencez par créer un BehaviorSubject et un Observable dans votre Service
loop() {
var that = this;
this.http.get(myUrl, { headers }).subscribe(
(data: any) => {
this.mySubject.next(data);
setTimeout(function () {
that.timeout();
}, 5000);
}
Ensuite, créez la fonction qui sera déclenchée une fois puis va dans une boucle infinie.
private mySubject: BehaviorSubject<any> = new BehaviorSubject<>(null); myObservable$: Observable<any> = this.mySubject.asObservable();
Pourquoi setTimeout ? Qu'en est-il d'une manière pure rxjs de faire cela afin que le code n'ait pas à s'appuyer sur window.setTimeout ?
utilisateur repeat et timer opérateur, ou repeatWhen
getData (): Observable<CurrentData> {
return httpRequest().pipe(map(.....),timer(5000),repeat())
}
getData (): Observable<CurrentData> {
return httpRequest().pipe(map(.....),repeatWhen(()=>timer(5000)))
}
vous pouvez utiliser l'opérateur exhaustMap , il ignorera jusqu'à ce que le dernier soit complet
getData (): Observable<CurrentData> {
return interval(5000)
.pipe(
exhaustMap(() => "HTTP REQUEST",
),
map(this.extractData, this))
}
Renvoie un Observable qui émet des éléments en fonction de l'application d'une fonction que vous fournissez à chaque élément émis par l'Observable source, où cette fonction renvoie un Observable (appelé «interne»). Lorsqu'il projette une valeur source sur un Observable, la sortie Observable commence à émettre les éléments émis par cet Observable projeté. Cependant, exhaustMap ignore chaque nouvel Observable projeté si l'Observable projeté précédent n'est pas encore terminé. Une fois celui-ci terminé, il acceptera et aplatira le prochain observable projeté et répétera ce processus.
stackoverflow.com/a/42415153/2257128