仅在前面的observable成功时才调用服务

时间:2015-02-23 21:47:53

标签: retrofit observable rx-java rx-android

背景

我正在深入研究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());

2 个答案:

答案 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()。