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)); }
3 Réponses :
Utilisez switchMap au lieu de mergeMap
Je suis passé à switchMap
et il appelle toujours les deux points de terminaison
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
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(); } }) }); }