RXJS轮询无需递归

时间:2019-01-04 22:13:05

标签: typescript rxjs

服务器正在同时处理多个请求。致电服务以检查每个请求的状态。服务接受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实现此目的

1 个答案:

答案 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