Angular 7 / RxJs: конечная точка опроса с ответом первой конечной точки - PullRequest
1 голос
/ 10 мая 2019

У меня есть конечная точка (initiate$), которую я нажал, и она возвращает queueId, с этим queueId Я нажимаю на другую конечную точку, пока эта конечная точка не вернет состояние готовности.У меня есть код, который работает, но он постоянно вызывает обе конечные точки.Я знаю, почему он вызывает оба, но я не могу понять, как лучше разделить вызов, чтобы просто попасть во вторую конечную точку (status$) при последующих вызовах.

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 ]

1 голос
/ 10 мая 2019

Используйте оператор shareReplay().Это многоадресный источник, наблюдаемый через ReplaySubject (другими словами - ReplaySubject подписывается на источник и передает его последнее значение будущим наблюдателям).

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

Для справкивот ДЕМО

0 голосов
/ 10 мая 2019

Если я вас правильно понял, вы хотите, чтобы изначально, чтобы запрос идентификатора очереди выполнялся один раз, а после слов инициировался опрос для запроса данных, пока возвращенное состояние не будет готово правильно?

Попробуйте следующее

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 голосов
/ 10 мая 2019

Использовать switchMap вместо mergeMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...