Повтор
если источник Observable испускает ошибку, подпишитесь на него повторно в надежде, что он завершит работу без ошибок
Оператор Retry реагирует на уведомление onError от источника Observable, не передавая этот вызов своим наблюдателям, но вместо этого подписываясь на источник Observable повторно и давая ему ещё один шанс завершить свою последовательность без ошибок. Retry всегда передает уведомления onNext своим наблюдателям, даже из последовательностей, которые завершаются ошибкой, поэтому это может привести к дублированию испусканий (как показано на диаграмме выше).
См. также
Информация, специфичная для языка
RxClojure
RxClojure не реализует оператор Retry.
RxCpp retry
RxCpp реализует этот оператор как retry:
retry принимает один аргумент, количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст уведомление onError своим наблюдателям.
RxGroovy retry retryWhen
RxGroovy имеет две версии этого оператора: retry и retryWhen.
Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.
Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.
Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.
retry по умолчанию работает на trampoline планировщике.
- Javadoc:
retry() - Javadoc:
retry(long) - Javadoc:
retry(Func2)
Оператор retryWhen похож на retry, но принимает решение о повторной подписке на исходный Observable, передавая исключение из уведомления onError функции, которая генерирует второй Observable, и наблюдая за его результатом для определения действий. Если результатом является элемент, retryWhen повторно подписывается на исходный Observable, и процесс повторяется; если результатом является уведомление onError, retryWhen передает это уведомление своим наблюдателям и завершается.
retryWhen по умолчанию работает на trampoline планировщике, также имеется версия, принимающая планировщик в качестве параметра.
- Javadoc:
retryWhen(Func1) - Javadoc:
retryWhen(Func1,Scheduler)
RxJava 1․x retry retryWhen
RxJava имеет две версии этого оператора: retry и retryWhen.
Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.
Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.
Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.
retry по умолчанию работает на trampoline планировщике.
- Javadoc:
retry() - Javadoc:
retry(long) - Javadoc:
retry(Func2)
Оператор retryWhen похож на retry, но принимает решение о повторной подписке на исходный Observable, передавая исключение из уведомления onError функции, которая генерирует второй Observable, и наблюдая за его результатом для определения действий. Если результатом является элемент, retryWhen повторно подписывается на исходный Observable, и процесс повторяется; если результатом является уведомление onError, retryWhen передает это уведомление своим наблюдателям и завершается.
retryWhen по умолчанию работает на trampoline планировщике, также имеется версия, принимающая планировщик в качестве параметра.
Пример кода
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
- Javadoc:
retryWhen(Func1) - Javadoc:
retryWhen(Func1,Scheduler)
RxJS retry
RxJS реализует этот оператор как retry.
Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.
Другая версия retry принимает один параметр: количество уведомлений onError, которые она готова принять, прежде чем тоже завершится ошибкой и передаст onError своим наблюдателям. Например, retry(2) означает, что retry будет подписываться на исходный Observable при первом получении уведомления onError, но завершится ошибкой во второй раз.
retry содержится в следующих дистрибутивах:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxKotlin retry retryWhen
RxKotlin имеет две версии этого оператора: retry и retryWhen.
Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.
Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.
Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.
Оператор retryWhen похож на retry, но принимает решение о повторной подписке на исходный Observable, передавая исключение из уведомления onError функции, которая генерирует второй Observable, и наблюдая за его результатом для определения действий. Если результатом является элемент, retryWhen повторно подписывается на исходный Observable, и процесс повторяется; если результатом является уведомление onError, retryWhen передает это уведомление своим наблюдателям и завершается.
RxNET Retry
Rx.NET реализует этот оператор как Retry.
Один из вариантов Retry не принимает параметров. Он будет продолжать подписываться на исходное Observable и отражать его независимо от того, сколько onError уведомлений он получит.
Другой вариант Retry принимает один параметр: количество onError уведомлений, которые он готов принять, прежде чем тоже завершится ошибкой и передаст onError своим наблюдателям. Например, Retry(2) означает, что Retry будет подписываться на исходное Observable и отражать его в первый раз, когда получит уведомление onError, но завершится ошибкой во второй раз.
RxPHP retry retryWhen
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
RxPY реализует этот оператор как retry:
retry принимает один необязательный параметр, количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст onError уведомление своим наблюдателям. Если вы опустите этот параметр, retry будет пытаться подписываться и отражать исходное Observable неограниченное количество раз, независимо от количества onError уведомлений, которые он получает.
Rxrb retry retry_infinitely
Rx.rb имеет две версии этого оператора: retry и retry_infinitely.
retry принимает один необязательный параметр, количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст onError уведомление своим наблюдателям.
retryInfinitely, с другой стороны, будет пытаться подписываться на исходное Observable неограниченное количество раз, независимо от количества onError уведомлений, которые оно получает.
RxScala retry retryWhen
RxScala имеет две версии этого оператора: retry и retryWhen.
Один вариант retry не принимает параметров. Он будет продолжать подписываться на исходное Observable независимо от того, сколько onError уведомлений он получит.
Другой вариант retry принимает один параметр: количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст последнее onError уведомление своим наблюдателям.
Третий вариант retry принимает функцию-предикат в качестве параметра. Вы пишете эту функцию, чтобы она принимала два аргумента: целое число count, количество попыток повтора, и исключение Throwable, указывающее на ошибку, которая вызвала onError уведомление. Эта функция возвращает логическое значение Boolean, чтобы указать, нужно ли retry повторно подписываться на исходное Observable и отражать его. Если нет, то retry передаёт последнее onError уведомление своим наблюдателям.
Оператор retryWhen похож на retry, но решает, подписываться ли повторно на исходное Observable и отражать его, передавая исключение Throwable из onError уведомления в функцию, которая генерирует второе Observable, и наблюдая за его результатом, чтобы определить, что делать. Если результат — это испущенный элемент, retryWhen повторно подписывается на исходное и процесс повторяется; если результат — это onError уведомление, retryWhen передаёт это уведомление своим наблюдателям и завершается.
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/retry.html