簡體   English   中英

RxJs 6 中的可觀察輪詢

[英]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方法是createinterval似乎是靜態的,沒有方法鏈接,...)。

如何在最新的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM