RxJava - как повторить две наблюдаемые в зависимости от второго ответа - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно два вызова API.

Я хочу позвонить 1 после ответного вызова 2, если 2 result равно notValid, повторить полную последовательность еще 3 раза.

Любые предложения, как это сделать?

Я использую retrofit и оба запроса Observable's

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Предполагая, что ваши Observable s возвращают один объект (в этом случае вместо этого предпочтительнее было бы Single), flatMap выдает результат первого на второй, затем условно отказывает второму с ошибкой, чтобы получить Повторите попытку , найдите и выполните свою работу:

static final class RetryRequestedException extends Exception { }

// no need for more than one of this
static final RetryRequestedException RETRY_INDICATOR = new RetryRequestedException();

source1.flatMap(value1 -> 
    source2.flatMap(value2 -> {
       if (value2.notValid) {
          return Observable.error(RETRY_INDICATOR);
       }
       return Observable.just(value2);
    })
)
.retry(3, error -> error == RETRY_INDICATOR)
...
0 голосов
/ 14 февраля 2019

вам нужно использовать switchMap для этого, так что это будет что-то вроде:

final PublishSubject<Object> retry = PublishSubject.create()

final Observable<YourObject> twoResponses = retry
    .startWith(new Object())
    .switchMap {
        service.call1()
            .switchMap { response1 -> 
                service.call2()
                    .map { response2 -> /* combine response1 and response2 to YourObject*/}
        }
    }
    .subscribeOn(networkScheduler)
    .observeOn(uiScheduler)
    .replay(1).refCount()

twoResponses.filter { /* need to retry */ }
    .map { new Object() }
    .subscribe(retry)  //don't forget to unsubscribe when activity close
...