RxJava проверяет состояние с задержкой - PullRequest
0 голосов
/ 19 мая 2018

Допустим, мне нужно запросить отчет из удаленного сервиса.В соответствии с его API, мне нужно сделать это в 3 этапа: 1. Отправить запрос на сбор отчетов (в качестве ответа я получаю reportId).2. Проверяйте состояние отчета до тех пор, пока он не будет «готов» с некоторой задержкой (например, 10 секунд).3. И, наконец, получите отчет по идентификатору.

Итак, вопрос в следующем: есть ли способ с помощью API RxJava проверять функцию предиката, пока она не вернет true с некоторой задержкой?

Наиболеесоответствующий оператор, который я мог найти, был 'takeUntil', а код был примерно таким:

Observable.just(request)
            .map(this::submitAndGetId)
            .takeUntil(this::reportIsDone)
            .map(this::getReport)

Но я не смог найти способ указать задержку между проверками статуса

1 Ответ

0 голосов
/ 20 мая 2018

Используйте flatMap и interval:

Observable
  .just(request)
  .map(this::submitAndGetId)
  .flatMap(id -> 
    Observable
        .interval(1, TimeUnit.SECONDS)
        .filter(n -> reportIsDone(id))
        .map(n -> id)
        .first()
  )
  .map(this::getReport);

Для ограниченного экспоненциального отката при повторных попытках:

Observable<Long> retries = 
  Observable
    .just(1, 2, 4, 8, 16)
    .concatWith(Observable.just(30).repeat())
    .flatMap(n -> Observable.timer(n, TimeUnit.SECONDS));

Observable
  .just(request)
  .map(this::submitAndGetId)
  .flatMap(id -> 
     retries
        .filter(n -> reportIsDone(id))
        .map(n -> id)
        .first()
  )
  .map(this::getReport);
...