Angular 7 / RxJs:具有第一个端点响应的轮询端点

时间:2019-05-09 22:28:29

标签: angular rxjs

我有一个命中的端点(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 个答案:

答案 0 :(得分:1)

使用shareReplay()运算符。它通过 ReplaySubject 多播可观察的源(换句话说-ReplaySubject订阅源并将其最后一个值广播给将来的观察者)。

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

供参考,这里是a DEMO

答案 1 :(得分:0)

使用switchMap代替mergeMap

答案 2 :(得分:0)

如果我对您的理解是正确的,那么您首先希望一次获得队列ID的调用,然后再启动轮询器以轮询数据,直到返回的状态准备好正确为止?

尝试以下

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