RxJava:运行一个可编译列表,直到一个成功



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

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

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

我没有使用mergeconcat因为它们将执行所有 Completables。我希望它在找到成功后停止执行 Completables。

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

可能的解决方案,不过需要一点 RxAcrobatics:

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

如果你可以控制返回Completable的函数,我建议把它改成一个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()

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

相关内容

  • 没有找到相关文章

最新更新