Как повторить одно, но продолжить с другими в итерируемой наблюдаемой RxJava - PullRequest
0 голосов
/ 27 августа 2018

Скажем, у меня есть Observable, который я создал из итерируемого или массива. Если я сопоставляю это наблюдаемое с методом, который возвращает что-то, как я могу повторить это поведение, если получу значение, которое мне не нравится, а также продолжу работу с элементами в итерируемом / массиве, для которого я получил значение, которое мне понравилось

Вот код seudo-кода, чтобы изобразить то, о чем я говорю:

Observable
  .fromIteratable(values)
  .map(value -> getSomeDataFromAnAPI(value))
  .retryIf(value -> value != somethingIWant)
  .delay(10, TimeUnit.SECONDS);

Я ищу, как выполнить поведение "retryIf".

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Если вам не нравится выбранное значение, вы можете отклонить его (принудительно!), Сопоставив его с ошибкой, а затем с помощью оператора retryWhen() повторить попытку.

Observable
  .fromIterable( values )
  .flatMap( value -> getSomeDataFromAnAPI( value )
                       .doOnNext( value -> {
                          if ( value != somethingIWant ) {
                            throw new IllegalStateException("undesired");
                          }
                       })
                       .retryWhen( throwable -> throwable.delay( 10,  TimeUnit.SECONDS) );

Это будет повторять элемент, возвращающий плохое значение, пока он не вернет хорошее.

Обратите внимание, что flatMap() будет пытаться выполнить каждый запрос в планировщике по умолчанию, что приведет к ряду параллельных запросов. Вы можете добавить параметр для ограничения параллелизма.

0 голосов
/ 27 августа 2018

Поставьте цикл вокруг вызова и вернитесь к желаемому значению:

Observable
.fromIteratable(values)
.map(value -> {
    while (true) {
        Data d = getSomeDataFromAnAPI(value));
        if (d == somethingIWant) {
            return d;
        }
    }
}
.delay(10, TimeUnit.SECONDS);
...