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