保持网络查询,然后检查RxJava是否需要另一个

时间:2018-01-31 12:08:19

标签: kotlin rx-java

这似乎应该很简单,但我正在努力使用正确的RxJava链流。

例如,什么不起作用是使用flatMap来持久化数据并检查是否需要另一个api查询:

return remote(amount = 2))
        .subscribeOn(Schedulers.io())
        .flatMap {
            insertAll(it)
            // Return an Observable<Boolean>, true if another api query is needed
            shouldGetMore(it)
        }
        .flatMap {
            if (it) remote(amount = 3)
            // If another query is not needed just return an empty observable
            else Observable.just(listOf())
        }
        .flatMapCompletable { insertAll(it) /* If another query was needed insert the result here */  }
        .observeOn(AndroidSchedulers.mainThread())

有了上述内容,insertAll()首次未被调用,因为函数insetrtAll是可填写的,因此未在flatMap订阅。而是仅执行shouldGetMore()。现在,这是我的问题:

为了实现这一点,我需要一个flatMapCompletable,如下所示:

return remote(amount = 2))
        .subscribeOn(Schedulers.io())
        .flatMapCompletable { insertAll(it) }
        // ...

但如果我这样做,那么我就无法再访问第一个api查询的结果来检查我是否shouldGetMore。我唯一的想法是让insertAll不是Completable而是Observable,它会返回事后保留的内容,从而允许我完成链。

但这似乎是一种丑陋的做法,所以如果其他人有任何其他想法我会很好奇吗?

感谢。

1 个答案:

答案 0 :(得分:2)

CompletableandThen运算符提供了继续使用任何反应基类型的权力:

return remote(amount = 2))
    .subscribeOn(Schedulers.io())
    .flatMap {
        insertAll(it)
        .andThen(shouldGetMore(it)) // <----------------------------------------
    }
    .flatMap {
        if (it) remote(amount = 3)
        else Observable.just(listOf())
    }
    .flatMapCompletable { insertAll(it) }
    .observeOn(AndroidSchedulers.mainThread())