RxJava:运行可完成列表,直到成功

时间:2018-10-13 14:52:43

标签: kotlin rx-java rx-java2

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

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

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

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

我没有使用mergeconcat,因为它们将执行所有Completable。我希望它一旦发现成功就停止执行Completables。

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

2 个答案:

答案 0 :(得分:2)

可能的解决方案,但是需要一点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()

答案 1 :(得分:0)

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