RxJ中的可观察轮询6

时间:2018-05-21 12:07:06

标签: javascript angular rxjs

只是想将我的一些遗留代码迁移到更新版本的RxJs。该代码用于轮询:

Observable
  .interval(5000)
  .startWith(0)
  .switchMap(() => this.apiService.getData())
  .subscribe(data => /* ... */)

这在RxJs 5.2.0中运行良好。

在RxJs 6.0.0中,由于多种原因,这不起作用(Observable只有方法createinterval似乎是静态的,没有方法链接,...... )。

如何在最新的RxJ中执行此操作?

2 个答案:

答案 0 :(得分:1)

我没有运行它:

interval(5000).pipe(
    switchMap(() => this.apiService.getData())
).subscribe(data => /* ... */)

Interval现在是一个函数,它返回一个Observable,并在pipe函数内链接转换。

答案 1 :(得分:0)

参考LeeCampbell's RxCookbook有关反应式编程。使用间隔实际上是不实际的。因为如果在间隔值中没有收到this.apiService.getData()的响应,则间隔将发出另一个值并执行新的请求。

您需要做的是使用一个发出单个值的计时器,使用switchMap来执行您的请求,并重复一次以在成功后再次轮询。此外,如果您想在出错后重试,则可以在重复之前使用重试。

这是使用Rx.Net(Ref)在C#中的实现:

public static IObservable<T> Poll<T>(this IObservable<T> request, TimeSpan period, IScheduler scheduler)
{
    return Observable.Timer(period, scheduler)
      .SelectMany(_ => request)
      .Retry()    //Loop on errors
      .Repeat();  //Loop on success
}

可以将以下内容翻译为RxJS 6:

timer(5000).pipe(
    switchMap(tick => this.apiService.getData()),
    retry(3), // retry 3 times before bubbling an error
    repeat()
);

可以在LeeCampbell's RxCookbook中找到更多增强功能。