0
votes

RXJS: requête après réponse

je veux créer un observable qui gère ces derniers:

  1. observable
    • Requête http
    • Réponse
    • attendez 5 secondes et recommencez la requête.

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 :


0
votes

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();


1 commentaires

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 ?



2
votes

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)))
  }


0 commentaires

0
votes

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))
}


1 commentaires

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.