Как сказать, какие Completables в mergeDelayError не сигнализируют по таймауту - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть этот код 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)

1 Ответ

0 голосов
/ 06 ноября 2019

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

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
)
...

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

...