这似乎应该很简单,但我正在努力使用正确的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
,它会返回事后保留的内容,从而允许我完成链。
但这似乎是一种丑陋的做法,所以如果其他人有任何其他想法我会很好奇吗?
感谢。
答案 0 :(得分:2)
Completable
为andThen
运算符提供了继续使用任何反应基类型的权力:
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())