什么 RxJava 运算符仅在某些条件下用于链接可观察对象 [英] What RxJava operator to use to chain observables only under certain conditions
问题描述
我正在 RxJava/Android 中开发一个完整的应用程序,试图使事情成为最可能的 Rx 方式.
I'm developing a whole application in RxJava/Android, trying to make the things the most Rx-way possible.
我想我正在实现我想要的,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点.它包括:
I think I'm achieving what I wanted, but now I've encountered an issue that I'm sure that exists a better way to do it. It consists of:
- 从 Observable 中获取布尔值
- A:如果为真,则完成,返回真.B:如果为 false,则发出请求(称为 firstRequest)并接收一个 Observable.
- A:同理,如果为真,则完成,返回真.B:如果是假的,那么再发出一个请求(secondRequest).
- A:如果它返回 true,那么你又完成了.如果为 false,则启动 processFailed();
现在我已经以一种非常幼稚的方式(并且是次优的)实现了它:
Right now I've implemented it in a very naive way (and sub-optimal):
public void startProcess(){
dataRepository.getStatus()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
makeFirstRequest();
}
});
}
private void makeFirstRequest(){
dataRepository.firstRequest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
makeSecondRequest();
}
});
}
private void makeSecondRequest(){
dataRepository.firstRequest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(status -> {
if(status){
processCompleted();
} else {
processFailed();
}
});
}
我想知道如何以更有意义的方式组合这些操作(我偷看了 combine
,但我认为这不是预期的用例),并订阅了 3 次我认为这是不对的.
I would like to know how to combine those operations in a way that made more sense (I peeked at combine
, but I think it's not the intended use case for this), and subscribing three times it's not right, I think.
我考虑过 flatMapping(因为它返回一个 Observable 是有意义的),但是嵌套的操作链(flatMap 内 flatMap 内 flatMap 内)让我认为必须有一种更简单的方法来实现与某些运算符相同的结果.
I thought about flatMapping (as it makes sense returning an Observable), but the nested chain of operations (flatMap inside flatMap inside flatMap) made me think that there has to be a simpler way of achieving the same result with some operators.
提前致谢.
推荐答案
flatMap
来拯救:
dataRepository.getStatus()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest())
.flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest())
.defaultIfEmpty(false)
.subscribe(status -> {
if(status){
processCompleted();
} else {
processFailed();
}
});
您也可以将 Observable.empty
替换为 Observable.just(status)
.
You can also replace Observable.empty
with Observable.just(status)
.
这篇关于什么 RxJava 运算符仅在某些条件下用于链接可观察对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!