Как узнать, какие Completables в mergeDelayError не сигнализировали о тайм-ауте

У меня есть этот код Android Kotlin со списком комплементов, которые объединены в более крупный с mergeDelayError(), у которого есть тайм-аут. По истечении времени ожидания я получаю java.util.concurrent.TimeoutException: The source did not signal an event for 250 milliseconds and has been terminated.

Как я могу определить, какая из небольших комплементов в списке достигла тайм-аута, ничего не сигнализируя/излучая (фактический список имеет более двух BTW). Моим идеальным решением было бы заменить такое исключение чем-то вроде: Exception: The following operations reached a timeout: Check initial settings, Check server или, по крайней мере, определенной строкой журнала, распечатываемой каждым комплементом с истекшим временем ожидания.

Я понятия не имею, как это сделать. Мое первое предположение было бы просто добавить флаг «didEmit» к каждому комплементу и проверять их один за другим, когда истечет время ожидания на большом комплементе, но мне это кажется плохим решением.

Любые идеи приветствуются. Спасибо.

        val smallCompletable1 = controller
        .checkInitialSettings()
        .doOnError {
            logError(it)
        }
        .ignoreElement()

        val smallCompletable2 = controller
        .checkServerStatus()
        .doOnError {
            logError(it)
        }
        .ignoreElement()

        val myCompletables: List<Completable> = listOf(
            smallCompletable1,
            smallCompletable2
        )

        val bigDisposable = Completable
        .mergeDelayError(myCompletables)
        .timeout(250, TimeUnit.MILLISECONDS)
        .subscribe(this::handleAllSucceeded, this::handleError)

        composition.add(bigDisposable)

person DuckN'Bear    schedule 06.11.2019    source источник


Ответы (1)


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

val smallCompletable1 = controller
    .checkInitialSettings()
    .doOnError{...}
    .timeout(250, TimeUnit.MILLISECONDS)
    .ignoreElement()

val completable1 = Completable.create { emitter ->
    smallCompletable1.subscribe(
        { emitter.onComplete() },
        { exp -> emitter.onError([YourCustomException]) }
    )
}
// do the same for smallCompletable2

val myCompletables: List<Completable> = listOf(
    completable1,
    completable2
)
...

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

person Dat Pham Tat    schedule 06.11.2019