只是想将我的一些遗留代码迁移到更新版本的RxJs。该代码用于轮询:
Observable
.interval(5000)
.startWith(0)
.switchMap(() => this.apiService.getData())
.subscribe(data => /* ... */)
这在RxJs 5.2.0
中运行良好。
在RxJs 6.0.0
中,由于多种原因,这不起作用(Observable
只有方法create
,interval
似乎是静态的,没有方法链接,...... )。
如何在最新的RxJ中执行此操作?
答案 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中找到更多增强功能。