1
votes

Angular 7 / RxJs: interroger le point de terminaison avec la réponse du premier point de terminaison

J'ai un point de terminaison ( initiate $ ) que je frappe et il renvoie un queueId , avec ce queueId je frappe un autre point de terminaison jusqu'à ce que endpoint renvoie le statut prêt. J'ai du code qui fonctionne mais qui appelle les deux points de terminaison en continu. Je sais pourquoi il appelle les deux, mais je ne peux pas comprendre comment séparer au mieux l'appel pour atteindre le deuxième point de terminaison ( status $ ) lors des appels suivants.

RxJs: "^ 6.3.3"

downloadTransactionList() {
  const initiate$ = this.exampleService.startListExport(userId, filter);
  const status$ = this.exampleService.pollListExport(initiate$);
  const polling$ = timer(0, 10000).pipe(
    mergeMap(() => status$),
    takeWhile(resp => resp.status !== 'ready')
  );
  initiate$.pipe(mergeMap(() => polling$)).subscribe(r => console.log(r));
}


0 commentaires

3 Réponses :


0
votes

Utilisez switchMap au lieu de mergeMap


1 commentaires

Je suis passé à switchMap et il appelle toujours les deux points de terminaison



1
votes

Utilisez un opérateur shareReplay () . Il multidiffuse la source observable via ReplaySubject (en d'autres termes - ReplaySubject s'abonne à la source et diffuse sa dernière valeur aux futurs observateurs).

this.exampleService.startListExport (userId, filter) .pipe (shareReplay ())

Pour référence, voici un DÉMO


0 commentaires

0
votes

Si je vous ai bien compris, vous voulez qu'au départ, un appel pour obtenir un identifiant de file d'attente soit effectué une fois, et après, un interrogateur est lancé pour interroger les données, jusqu'à ce que l'état renvoyé soit prêt correct?

Essayez ce qui suit

downloadTransactionList() {
   // This calls startListExport to get the queue id
   this.exampleService.startListExport(userId, filter).subscribe((queueId:string) => {
       // When it has successfully returned, initiate the poller
       let timerSubscription:Subscription = timer(0, 10000).pipe(switchMap(() => {
           // Assuming this returns an observable with the status
           return this.exampleService.pollListExport(queueId);
       })).subscribe((data:myType) => {
           // DO something with your data

           // Unsubscribe to stop the poller when criteria is met
           if (data.status === 'ready') {
              timerSubscription.unsubscribe();
           }
       })
   });
}


0 commentaires