Retry 操作符會回應來自來源 Observable 的 onError
通知,它不會將此呼叫傳遞給其觀察者,而是重新訂閱來源 Observable 並給它另一次無錯誤完成序列的機會。Retry 總是將 onNext
通知傳遞給其觀察者,即使是來自以錯誤終止的序列,因此這可能會導致重複發射(如上圖所示)。
RxClojure 沒有實作 Retry 操作符。
RxCpp 將此操作符實作為 retry
retry
接受一個參數,即在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry
將不會嘗試重新訂閱,而是將 onError
通知傳遞給其觀察者。
RxGroovy 有此操作符的兩個版本:retry
和 retryWhen
。
retry
的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError
通知。
retry
的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry
將不會嘗試再次重新訂閱,而是將最新的 onError
通知傳遞給其觀察者。
retry
的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError
通知的錯誤。此函數會返回一個布林值,表示 retry
是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry
會將最新的 onError
通知傳遞給其觀察者。
預設情況下,retry
在 trampoline
Scheduler 上運作。
retry()
retry(long)
retry(Func2)
retryWhen
操作符類似於 retry
,但它透過將來自 onError
通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen
會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError
通知,retryWhen
會將此通知傳遞給其觀察者並終止。
預設情況下,retryWhen
在 trampoline
Scheduler 上運作,並且還有一個接受 Scheduler 作為參數的版本。
retryWhen(Func1)
retryWhen(Func1,Scheduler)
RxJava 有此操作符的兩個版本:retry
和 retryWhen
。
retry
的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError
通知。
retry
的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry
將不會嘗試再次重新訂閱,而是將最新的 onError
通知傳遞給其觀察者。
retry
的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError
通知的錯誤。此函數會返回一個布林值,表示 retry
是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry
會將最新的 onError
通知傳遞給其觀察者。
預設情況下,retry
在 trampoline
Scheduler 上運作。
retry()
retry(long)
retry(Func2)
retryWhen
操作符類似於 retry
,但它透過將來自 onError
通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen
會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError
通知,retryWhen
會將此通知傳遞給其觀察者並終止。
預設情況下,retryWhen
在 trampoline
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
retryWhen(Func1)
retryWhen(Func1,Scheduler)
RxJS 將此操作符實作為 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 有此操作符的兩個版本:retry
和 retryWhen
。
retry
的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError
通知。
retry
的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry
將不會嘗試再次重新訂閱,而是將最新的 onError
通知傳遞給其觀察者。
retry
的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個整數計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError
通知的錯誤。此函數會返回一個布林值,表示 retry
是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry
會將最新的 onError
通知傳遞給其觀察者。
retryWhen
操作符類似於 retry
,但它透過將來自 onError
通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen
會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError
通知,retryWhen
會將此通知傳遞給其觀察者並終止。
Rx.NET 將此操作符實作為 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
接受一個單一的可選參數,即在遇到錯誤時應嘗試重新訂閱並鏡像來源 Observable 的次數。如果超過此次數,retry
將不會嘗試重新訂閱,而是將 onError
通知傳遞給其觀察者。如果您省略此參數,則無論收到多少個 onError
通知,retry
都會嘗試無限期地重新訂閱和鏡像。
Rx.rb 有此操作符的兩個版本:retry
和 retry_infinitely
。
retry
接受一個單一的可選參數,即在遇到錯誤時應嘗試重新訂閱並鏡像來源 Observable 的次數。如果超過此次數,retry
將不會嘗試重新訂閱,而是將 onError
通知傳遞給其觀察者。
另一方面,retryInfinitely
會嘗試無限期地重新訂閱並鏡像來源 Observable,無論收到多少個 onError
通知。
RxScala 有此操作符的兩個版本:retry
和 retryWhen
。
retry
的一個變體不帶任何參數。它會持續重新訂閱並鏡像來源 Observable,無論收到多少個 onError
通知。
retry
的另一個變體接受一個參數:在遇到錯誤時應嘗試重新訂閱來源 Observable 的次數。如果超過此次數,retry
將不會嘗試再次重新訂閱,而是將最新的 onError
通知傳遞給其觀察者。
retry
的第三個變體接受一個謂詞函數作為參數。您撰寫此函數以接受兩個參數:一個 Int 計數,表示迄今為止已發生的重試次數,以及一個 Throwable,表示導致 onError
通知的錯誤。此函數會返回一個布林值,表示 retry
是否應重新訂閱並鏡像來源 Observable。如果不是,則 retry
會將最新的 onError
通知傳遞給其觀察者。
retryWhen
操作符類似於 retry
,但它透過將來自 onError
通知的 Throwable 傳遞給一個產生第二個 Observable 的函數,並觀察其結果來決定是否重新訂閱並鏡像來源 Observable。如果該結果是發射的項目,retryWhen
會重新訂閱並鏡像來源,並且該過程會重複;如果該結果是 onError
通知,retryWhen
會將此通知傳遞給其觀察者並終止。