Kotlin RxJava:运行一个completable列表,直到其中一个成功

Kotlin RxJava:运行一个completable列表,直到其中一个成功,kotlin,rx-java,rx-java2,Kotlin,Rx Java,Rx Java2,我有一个函数,它接受单个输入并返回一个Completable 我希望在候选输入列表上按顺序运行该函数,直到找到一个完全表完成且没有错误的输入 fun doStuff(input: Int): Completable { ... } Observable.just(1,2,3,4) .flatMapCompletable { doStuff(it) } .??? // Run completables until one succeeds 我没有使用me

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

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

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

Observable.just(1,2,3,4)
          .flatMapCompletable { doStuff(it) }
          .??? // Run completables until one succeeds
我没有使用
merge
concat
,因为它们将执行所有的completable。我希望它在找到一个成功的completable之后停止执行它


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

使用
takeUntil
检查谓词是否成功。

可能的解决方案,尽管需要一点RX特技:

Observable
    .just(1, 2, 3, 4)
    .flatMapSingle { arg ->
        doStuff(arg)
            .toSingle { true }
            .onErrorReturn { false }
    }
    .filter { it }
    .firstElement()
    .subscribe()
如果您可以控制返回可完成的
函数,我建议将其更改为单个
,这样您可以更优雅地使用
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()

Completable不会告诉您它完成时有无错误,除非您订阅它。您可以使用
blockingGet()
捕获异常,直到Completable无误完成。