Как я могу распространить throwable на следующую цепочку Completable? - PullRequest
1 голос
/ 10 февраля 2020

Я разрабатываю приложение Android с использованием Rx Java.

У меня есть несколько цепочек вызовов API.

  1. проверки
  2. потребления
val verify = Completable.error(Exception("TEST"))
            .doOnSubscribe { Log.d(TAG, "1. verify") }
            .doOnComplete{ Log.d(TAG, "1. verify - success") }
            .doOnError { Log.e(TAG, "1. verify - failed: ${it.message}") }
            .retryWhen { attempts ->
                attempts.zipWith(
                    Flowable.range(1, 3), BiFunction<Throwable, Int, Long> { t, i ->
                        if (i <= 3) {
                            1L
                        } else {
                            throw t
                        }
                    }
                ).flatMap {
                    Flowable.timer(it, TimeUnit.SECONDS)
                }
            }

// 2. consume
val consume = Single.just("SUCCESS")
    .doOnSubscribe { Log.d(TAG, "2. consume") }
    .doOnSuccess { Log.d(TAG, "2. consume - success") }
    .doOnError { Log.e(TAG, "2. consume - failed: ${it.message}", it) }

disposable.add(
    verify.andThen (consume)
        .subscribeOn(ioScheduler)
        .observeOn(uiScheduler)
        .subscribe({
            Log.d(TAG, "done")
        }, { t ->
            Log.e(TAG, "failed: ${t.message}", t)
        })
);

То, что я исключил, это ...

"проверка" должна вызываться 3 раза каждые 1 секунду.

После неудачной попытки 3, это должно быть сделано с Ошибка.

Но в моем случае тоже было выполнено «потребление».

Почему?

Я хочу пропустить «потребить», если «проверить» не удалось!

Как мне это сделать?

1 Ответ

2 голосов
/ 10 февраля 2020

Это потому, что ваш код не сбой.

С помощью Flowable.range(1, 3) вы создаете диапазон от 1 до 3, поэтому остальная часть вашего кода никогда не будет достигнута.

Попробуйте с Flowable.range(1, 4), и вы увидите правильное поведение.

...