Tengo un punto final (initiate$) que golpeé y devuelve un queueId, con ese queueId golpeé otro punto final hasta que ese punto final devuelve el estado de listo. Tengo un código que funciona pero llama a ambos puntos finales continuamente. Sé por qué llama a ambos, pero no puedo encontrar la mejor manera de separar la llamada para golpear el segundo punto final (status$) uno en las llamadas posteriores.

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));
}
1
alphapilgrim 10 may. 2019 a las 01:28

3 respuestas

La mejor respuesta

Use un operador shareReplay(). Multicastiza la fuente observable a través de ReplaySubject (en otras palabras, ReplaySubject se suscribe a la fuente y transmite su último valor a futuros observadores).

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

Para la referencia, aquí está una DEMO

1
Julius Dzidzevičius 10 may. 2019 a las 06:15

Si te he entendido correctamente, ¿quieres que inicialmente, una llamada para obtener una identificación de la cola se realice una vez, y después, se inicia un sondeo para sondear los datos, hasta que el estado devuelto esté listo?

Pruebe lo siguiente

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
JeanPaul A. 10 may. 2019 a las 06:36

Use switchMap en lugar de mergeMap

0
Adrian Brand 10 may. 2019 a las 01:22