Kotlin RxJava:运行一个completable列表,直到其中一个成功
我有一个函数,它接受单个输入并返回一个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
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无误完成。