Typescript 无递归的RXJS轮询
服务器正在同时处理多个请求。调用服务以检查每个请求的状态。服务接受id列表,并给出每个id的状态,如下所示Typescript 无递归的RXJS轮询,typescript,rxjs,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 &g
{ 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);
});
}
}
poll(requestid:Array):无效{
如果(requestIds.length>0){
callService(RequestId).subscribe((响应)=>{
const pending=response.reduce((结果、请求)=>{
if(request.status==1){result.push(request.id);}
}, []);
setTimeout(()=>poll(待定),5000);
});
}
}
在上面的例子中没有提到的是clearTimeout和订阅列表,当轮询停止时,该列表将被清除。我知道这可以通过repeatWhen和takeWhile实现,这是一个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();
这里您可以看到一个演示:您可以使用
expand
操作符:它仍然是递归调用。不,它是迭代调用。概念上可能是递归的,但实现将是迭代的。您是否要求使用repeatWhen
或takeWhen
来解决问题?到目前为止你有什么?上面评论中的博文链接不再有效。文章的规范链接是: