RxJava:忽略Flowable中的一些错误

时间:2019-04-07 08:54:57

标签: kotlin rx-java2 rx-kotlin2

我有一个Flowable<T>,并且我想忽略的错误是IgnoreThisError的子类型(导致正常完成),所有其他错误应向下游传播。

Kotlin示例:

val f : Flowable<T> = ...
val g = f.onErrorComplete { it is IgnoreThisError }

此功能onErrorComplete是我所需要的,并且不存在...

2 个答案:

答案 0 :(得分:1)

类似的事情应该起作用

f.onErrorResumeNext {
    if (it is IgnoreThisError)
        Flowable.empty()
    else
        Flowable.error(it)
}

我不确定Kotlin是否会由于重载和Java对签名方差的仿真而在此处正确推断类型,否则,您可能需要更加明确:

f.onErrorResumeNext(Function<Throwable, Publisher<T>> {
    if (it is IgnoreThisError)
        Flowable.empty()
    else
        Flowable.error(it)
})

答案 1 :(得分:1)

以下是缺少的onErrorComplete作为扩展函数的解决方案:

/**
 * Errors encountered in the stream for which the provided `predicate` returns true will be silently turned into graceful completion.
 */
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
@SchedulerSupport(SchedulerSupport.NONE)
inline fun <T> Flowable<T>.onErrorComplete(crossinline predicate: (Throwable) -> Boolean): Flowable<T> =
  onErrorResumeNext { error: Throwable ->
    if (predicate(error)) Flowable.empty<T>() else Flowable.error<T>(error)
  }

请注意,我必须放置一个明确的error: Throwable ->,否则编译器会因为onErrorResumeNext的重载而抱怨。