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