首页 > 解决方案 > RxJava:运行一个可完成的列表,直到一个成功

问题描述

我有一个函数,它接受一个输入并返回一个 Completable。

我想在候选输入列表上按顺序运行该函数,直到找到一个 Completable 完成且没有错误的函数。

fun doStuff(input: Int): Completable { ... }

Observable.just(1,2,3,4)
          .flatMapCompletable { doStuff(it) }
          .??? // Run completables until one succeeds

我没有使用merge,或者concat因为他们将执行所有 Completables。一旦找到成功的 Completables,我希望它停止执行 Completables。

是否有实现此行为的标准操作?

标签: kotlinrx-javarx-java2

解决方案


可能的解决方案,虽然需要一点 RxAcrobatics:

Observable
    .just(1, 2, 3, 4)
    .flatMapSingle { arg ->
        doStuff(arg)
            .toSingle { true }
            .onErrorReturn { false }
    }
    .filter { it }
    .firstElement()
    .subscribe()

如果您可以控制返回 的函数Completable,我建议将其更改为 a Single<Boolean>,这样您可以像这样更优雅地使用takeUntil

Observable
    .just(1,2, 3, 4)
    .flatMapSingle(::doStuff)
    .takeUntil { it }
    .subscribe()

如果您无法控制返回 Completable 的函数,您仍然可以创建一个小包装器:

private fun doStuffWrap(foo: Int) = doStuff(foo)
    .toSingle { true }
    .onErrorReturn { false } 

并使用优雅的解决方案:

Observable
    .just(1, 2, 3, 4)
    .flatMapSingle(::doStuffWrap)
    .takeUntil { it }
    .subscribe()

推荐阅读