背景
我正在深入研究RX for java的概念。坦率地说,我不明白。在我的项目中,我使用改造库来调用服务。目前,我已使用回调实现了所有服务。如果我想编排服务调用,我必须在回调中调用回调,这会导致相当混乱的代码。
问题
对于以下两项服务,我想使用Observables方法成功完成服务A的服务B。
public interface RetrofitRestService {
@GET("...")
Observable<Object> A();
@GET("...")
Observable<Object> B();
}
我正在寻找Observable operators 我可以用来完成我的任务,但没有运气。我可以想象这样的运营商:
RetrofitRestServices service;
service.A().ifSuccessfull(B());
//OR
service.A().ifWasNotEmpty(B());
//OR
service.A().useCondition(new Condition(){ ... }, B());
答案 0 :(得分:3)
如果你想调用A,然后调用B,你可以使用运算符concat
:如果A完成,将调用B.
service.A().concatWith(service.B()).subscribe();
但如果A返回null
,则会调用B.
如果是这样的话,那么这个anwser会更好:https://stackoverflow.com/a/28685808/476690
评论后编辑
如果您想使用A()
的结果,那么flatMap
运算符就是您需要的
service.A().flatMap(resultOfA -> service.B(resultOfA)).subscribe();
(将resultOfA
作为B()
的参数只是一个使用示例)
另一种方式:
您也可以根据A的响应和B
的响应来构建结果service.A().flatMap(resultOfA -> service.B().zipWith(Observable.just(resultOfA), (a, b) -> new ResultOf(a, b))).subscribe();
在这种情况下, zip
运算符将使用A和B的结果构建结果。 ResultOf
只是一个示例类,用于说明如何使用A和B的结果构建结果。
有关flapMap
的更多信息:When do you use map vs flatMap in RxJava?
答案 1 :(得分:1)
这个怎么样:
service.A().isEmpty().filter(new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean empty) {
return !empty;
}
})
.flatMap(new Func1<Boolean, Observable<? extends Object>>() {
@Override
public Observable<? extends Integer> call(Boolean empty) {
return B();
}
});
isEmpty
运算符将发出一个布尔值,仅当A()不发出任何内容时才会为true。这就是为什么如果A()发出一个项目,过滤器检查isEmpty
的结果是否会通过,flatMap
将被调用,从而调用B()。