Spec-Zone.ru › ReactiveX

Повтор

если источник Observable испускает ошибку, подпишитесь на него повторно в надежде, что он завершит работу без ошибок
Retry

Оператор Retry реагирует на уведомление onError от источника Observable, не передавая этот вызов своим наблюдателям, но вместо этого подписываясь на источник Observable повторно и давая ему ещё один шанс завершить свою последовательность без ошибок. Retry всегда передает уведомления onNext своим наблюдателям, даже из последовательностей, которые завершаются ошибкой, поэтому это может привести к дублированию испусканий (как показано на диаграмме выше).

См. также

  • Catch
  • Введение в Rx: Повтор

Информация, специфичная для языка

RxClojure

RxClojure не реализует оператор Retry.

RxCpp retry

RxCpp реализует этот оператор как retry:

retry

retry принимает один аргумент, количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст уведомление onError своим наблюдателям.

RxGroovy retry retryWhen

RxGroovy имеет две версии этого оператора: retry и retryWhen.

retry

Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.

Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.

Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.

retry по умолчанию работает на trampoline планировщике.

  • Javadoc: retry()
  • Javadoc: retry(long)
  • Javadoc: retry(Func2)
retryWhen

Оператор 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

Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.

Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.

Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.

retry по умолчанию работает на trampoline планировщике.

  • Javadoc: retry()
  • Javadoc: retry(long)
  • Javadoc: retry(Func2)
retryWhen

Оператор 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

Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.

Другая версия retry принимает один параметр: количество уведомлений onError, которые она готова принять, прежде чем тоже завершится ошибкой и передаст onError своим наблюдателям. Например, retry(2) означает, что retry будет подписываться на исходный Observable при первом получении уведомления onError, но завершится ошибкой во второй раз.

retry содержится в следующих дистрибутивах:

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

RxKotlin retry retryWhen

RxKotlin имеет две версии этого оператора: retry и retryWhen.

retry

Одна из версий retry не принимает параметров. Она будет продолжать подписываться на исходный Observable и отражать его уведомления независимо от количества уведомлений onError.

Другая версия retry принимает один параметр: количество попыток повторной подписки на исходный Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписаться и вместо этого передаст последнее уведомление onError своим наблюдателям.

Третья версия retry принимает функцию-предикат в качестве параметра. Вы задаёте эту функцию для обработки двух аргументов: целого числа, счётчика попыток, и исключения, вызвавшего уведомление onError. Функция возвращает логическое значение, указывающее, следует ли retry повторно подписываться на исходный Observable и отражать его уведомления. Если нет, то retry передаст последнее уведомление onError своим наблюдателям.

retryWhen

Оператор retryWhen похож на retry, но принимает решение о повторной подписке на исходный Observable, передавая исключение из уведомления onError функции, которая генерирует второй Observable, и наблюдая за его результатом для определения действий. Если результатом является элемент, retryWhen повторно подписывается на исходный Observable, и процесс повторяется; если результатом является уведомление onError, retryWhen передает это уведомление своим наблюдателям и завершается.

RxNET Retry

Rx.NET реализует этот оператор как Retry.

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

retry принимает один необязательный параметр, количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст onError уведомление своим наблюдателям. Если вы опустите этот параметр, retry будет пытаться подписываться и отражать исходное Observable неограниченное количество раз, независимо от количества onError уведомлений, которые он получает.

Rxrb retry retry_infinitely

Rx.rb имеет две версии этого оператора: retry и retry_infinitely.

retry

retry принимает один необязательный параметр, количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст onError уведомление своим наблюдателям.

retryInfinitely, с другой стороны, будет пытаться подписываться на исходное Observable неограниченное количество раз, независимо от количества onError уведомлений, которые оно получает.

RxScala retry retryWhen

RxScala имеет две версии этого оператора: retry и retryWhen.

retry

Один вариант retry не принимает параметров. Он будет продолжать подписываться на исходное Observable независимо от того, сколько onError уведомлений он получит.

Другой вариант retry принимает один параметр: количество попыток повторной подписки на исходное Observable при возникновении ошибок. Если это количество превышено, retry не будет пытаться повторно подписываться и вместо этого передаст последнее onError уведомление своим наблюдателям.

Третий вариант retry принимает функцию-предикат в качестве параметра. Вы пишете эту функцию, чтобы она принимала два аргумента: целое число count, количество попыток повтора, и исключение Throwable, указывающее на ошибку, которая вызвала onError уведомление. Эта функция возвращает логическое значение Boolean, чтобы указать, нужно ли retry повторно подписываться на исходное Observable и отражать его. Если нет, то retry передаёт последнее onError уведомление своим наблюдателям.

retryWhen

Оператор 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API