我有一个如下所示的轮询场景,其中我每 1 秒轮询一次 Rest API 并等待结果
interval(1000)
.pipe(
startWith(0),
switchMap(() => this.itemService.getItems(shopId))
)
.subscribe(response => {
console.log(response);
if(response && response.status = false) {
// stop polling
}
);
});
轮询部分工作正常。问题是我希望当我收到响应且其状态为 false 时停止轮询。如何更改此代码以有条件地停止轮询?
你可以使用takeWhile
Pool()
{
interval(1000)
.pipe(
startWith(0),
switchMap(() => this.itemService.getItems(shopId)),
takeWhile(response=> response.status == true) //takeWhile(response=> response.status)
)
.subscribe(response => {
});
}
你可以这样做:
interval(1000).pipe(
mergeMap(t => this.itemService.getItems(shopId)),
filter(response => response.status === false),
take(1)
).subscribe(() => {
})
每秒执行http req检查状态。如果状态为 false,则停止轮询,您可以在订阅内运行逻辑。
另外,如果您需要在轮询后再次发出 http 请求,您可以这样做:
interval(1000).pipe(
mergeMap(t => this.itemService.getItems(shopId)),
filter(response => response.status === false),
take(1),
switchMap(() => // perform another http req )
).subscribe(() => {
})
请记住取消订阅,因为现在您拥有了 switchMap。