具有时间间隔的角度条件轮询

问题描述 投票:0回答:2

我有一个如下所示的轮询场景,其中我每 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 时停止轮询。如何更改此代码以有条件地停止轮询?

angular typescript rxjs polling
2个回答
2
投票

你可以使用takeWhile

 Pool()
    {
      interval(1000)
      .pipe(
        startWith(0),
        switchMap(() => this.itemService.getItems(shopId)),
        takeWhile(response=> response.status == true) //takeWhile(response=> response.status)
      )
      .subscribe(response => {
    
      });

}


0
投票

你可以这样做:

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。

© www.soinside.com 2019 - 2024. All rights reserved.