服务器正在同时处理多个请求。致电服务以检查每个请求的状态。服务接受ID列表,并将给出每个ID的状态,如下所示:
{ id: number, status: number}; Status 1 is pending and 2 is complete
需要轮询所有待处理的请求ID,直到所有请求完成为止
我有以下递归解决方案,但需要简洁的RXJS解决方案
poll(requestIds: Array<number>): void {
if (requestIds.length > 0) {
callService(requestIds).subscribe((response) => {
const pending = response.reduce((result, request) => {
if (request.status === 1) { result.push(request.id); }
}, []);
setTimeout(() => poll(pending), 5000);
});
}
}
在上面的示例中未提及的是clearTimeout和订阅列表,在轮询停止时会清除它们。我知道可以通过repeatWhen和takeWhile实现此目的
答案 0 :(得分:2)
这是实现递归的rxjs流:
callService(ids).pipe(
expand(reqs => reqs.length === 0
? empty()
: callService(
reqs.filter(req => req.status === 1).map(req => req.id)
).pipe(delay(1000))
)
).subscribe();
在这里您可以看到一个演示:https://stackblitz.com/edit/rxjs-aaxiru