Retry

如果來源 Observable 發射錯誤,重新訂閱它,希望它能無錯誤地完成

Retry

Retry 操作符會回應來自來源 Observable 的 onError 通知,它不會將此呼叫傳遞給其觀察者,而是重新訂閱來源 Observable 並給它另一次無錯誤完成序列的機會。Retry 總是將 onNext 通知傳遞給其觀察者,即使是來自以錯誤終止的序列,因此這可能會導致重複發射(如上圖所示)。

參見

特定語言資訊

RxClojure 沒有實作 Retry 操作符。

RxCpp 將此操作符實作為 retry

retry

retry 接受一個參數,即在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry 將不會嘗試重新訂閱,而是將 onError 通知傳遞給其觀察者。

RxGroovy 有此操作符的兩個版本:retryretryWhen

retry

retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

retry 的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry 將不會嘗試再次重新訂閱,而是將最新的 onError 通知傳遞給其觀察者。

retry 的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError 通知的錯誤。此函數會返回一個布林值,表示 retry 是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry 會將最新的 onError 通知傳遞給其觀察者。

預設情況下,retrytrampoline Scheduler 上運作。

retryWhen

retryWhen 操作符類似於 retry,但它透過將來自 onError 通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen 會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError 通知,retryWhen 會將此通知傳遞給其觀察者並終止。

預設情況下,retryWhentrampoline Scheduler 上運作,並且還有一個接受 Scheduler 作為參數的版本。

RxJava 有此操作符的兩個版本:retryretryWhen

retry

retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

retry 的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry 將不會嘗試再次重新訂閱,而是將最新的 onError 通知傳遞給其觀察者。

retry 的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError 通知的錯誤。此函數會返回一個布林值,表示 retry 是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry 會將最新的 onError 通知傳遞給其觀察者。

預設情況下,retrytrampoline Scheduler 上運作。

retryWhen

retryWhen 操作符類似於 retry,但它透過將來自 onError 通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen 會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError 通知,retryWhen 會將此通知傳遞給其觀察者並終止。

預設情況下,retryWhentrampoline Scheduler 上運作,並且還有一個接受 Scheduler 作為參數的版本。

範例程式碼

Observable.create((Subscriber<? super String> s) -> {
      System.out.println("subscribing");
      s.onError(new RuntimeException("always fails"));
  }).retryWhen(attempts -> {
      return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
          System.out.println("delay retry by " + i + " second(s)");
          return Observable.timer(i, TimeUnit.SECONDS);
      });
  }).toBlocking().forEach(System.out::println);
subscribing
delay retry by 1 second(s)
subscribing
delay retry by 2 second(s)
subscribing
delay retry by 3 second(s)
subscribing

RxJS 將此操作符實作為 retry

retry

retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

retry 的另一個變體接受一個參數:它願意接受的 onError 通知次數,之後它也會失敗並將 onError 傳遞給其觀察者。例如,retry(2) 表示 retry 在第一次收到 onError 通知時會重新訂閱並鏡像來源 Observable,但在第二次發生這種情況時會以錯誤終止。

retry 存在於下列發行版本中

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxKotlin 有此操作符的兩個版本:retryretryWhen

retry

retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

retry 的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry 將不會嘗試再次重新訂閱,而是將最新的 onError 通知傳遞給其觀察者。

retry 的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError 通知的錯誤。此函數會返回一個布林值,表示 retry 是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry 會將最新的 onError 通知傳遞給其觀察者。

retryWhen

retryWhen 操作符類似於 retry,但它透過將來自 onError 通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen 會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError 通知,retryWhen 會將此通知傳遞給其觀察者並終止。

Rx.NET 將此操作符實作為 Retry

Retry

Retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

Retry 的另一個變體接受一個參數:它願意接受的 onError 通知次數,之後它也會失敗並將 onError 傳遞給其觀察者。例如,Retry(2) 表示 Retry 在第一次收到 onError 通知時會重新訂閱並鏡像來源 Observable,但在第二次發生這種情況時會以錯誤終止。

RxPHP 將此操作符實作為 retry

將來源 observable 序列重複指定次數或直到成功終止。如果未指定重試次數,則會無限期重試。請注意,如果您遇到錯誤並希望它重試一次,則必須使用 ->retry(2)。

範例程式碼

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/retry/retry.php

$count = 0;

$observable = Rx\Observable::interval(1000)
    ->flatMap(function ($x) use (&$count) {
        if (++$count < 2) {
            return Rx\Observable::error(new \Exception('Something'));
        }
        return Rx\Observable::of(42);
    })
    ->retry(3)
    ->take(1);

$observable->subscribe($stdoutObserver);


   
Next value: 42
Complete!
    

RxPHP 也有一個操作符 retryWhen

當通知器發射下一個值時,會在發生錯誤時重複來源 observable 序列。如果來源 observable 發生錯誤且通知器完成,則會完成來源序列。

範例程式碼

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/retry/retryWhen.php

$source = Rx\Observable::interval(1000)
    ->map(function ($n) {
        if ($n === 2) {
            throw new Exception();
        }
        return $n;
    })
    ->retryWhen(function (\Rx\Observable $errors) {
        return $errors->delay(200);
    })
    ->take(6);

$subscription = $source->subscribe($createStdoutObserver());

   
Next value: 0
Next value: 1
Next value: 0
Next value: 1
Next value: 0
Next value: 1
Complete!
    

RxPY 將此操作符實作為 retry

retry

retry 接受一個單一的可選參數,即在遇到錯誤時應嘗試重新訂閱並鏡像來源 Observable 的次數。如果超過此次數,retry 將不會嘗試重新訂閱,而是將 onError 通知傳遞給其觀察者。如果您省略此參數,則無論收到多少個 onError 通知,retry 都會嘗試無限期地重新訂閱和鏡像。

Rx.rb 有此操作符的兩個版本:retryretry_infinitely

retry

retry 接受一個單一的可選參數,即在遇到錯誤時應嘗試重新訂閱並鏡像來源 Observable 的次數。如果超過此次數,retry 將不會嘗試重新訂閱,而是將 onError 通知傳遞給其觀察者。

另一方面,retryInfinitely 會嘗試無限期地重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

RxScala 有此操作符的兩個版本:retryretryWhen

retry

retry 的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError 通知。

retry 的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry 將不會嘗試再次重新訂閱,而是將最新的 onError 通知傳遞給其觀察者。

retry 的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個 Int 計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError 通知的錯誤。此函數會返回一個布林值,表示 retry 是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry 會將最新的 onError 通知傳遞給其觀察者。

retryWhen

retryWhen 操作符類似於 retry,但它透過將來自 onError 通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen 會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError 通知,retryWhen 會將此通知傳遞給其觀察者並終止。