[英]Observable polling in RxJs 6
只是想將我的一些遺留代碼遷移到較新版本的 RxJs。 該代碼用於輪詢:
Observable
.interval(5000)
.startWith(0)
.switchMap(() => this.apiService.getData())
.subscribe(data => /* ... */)
這在 RxJs 5.2.0
運行良好。
在 RxJs 6.0.0
中,由於多種原因,這不起作用(僅Observable
方法是create
, interval
似乎是靜態的,沒有方法鏈接,...)。
如何在最新的 RxJs 中做到這一點?
我沒有運行它:
interval(5000).pipe(
switchMap(() => this.apiService.getData())
).subscribe(data => /* ... */)
Interval
現在是一個返回 Observable 的函數,並且轉換在pipe
函數內被鏈接起來。
參考LeeCampbell關於反應式編程的 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 的 RxCookbook 中找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.