仅当前面的可观察对象成功时才调用服务

Call service only if preceding observable succeeded

背景

我只是在研究 java 的 RX 概念。坦率地说,我不明白。在我的项目中,我使用改造库来调用服务。目前,我已经使用回调实现了所有服务。如果我想编排服务调用,我必须在回调中调用回调,这会导致相当混乱的代码。

问题

对于以下两个服务,我想调用服务 B,当且仅当服务 A 使用 Observables 方法成功完成。

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());

这个怎么样:

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() 不发出任何东西时该值才为真。这就是为什么如果 A() 发出一个项目,过滤器检查 isEmpty 的结果是否会通过并调用 flatMap,从而调用 B()。

如果要先调用A,再调用B,可以使用运算符concat:A完成后调用B。

service.A().concatWith(service.B()).subscribe();

但是如果Areturnnull,B会被调用

如果是这样,那么这个答案会更好:

评论后编辑

如果您想使用 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();

zipoperator 将使用 A 和 B 的结果构建一个结果,在这种情况下。 ResultOf 只是一个示例 class 来展示如何使用 A 和 B 的结果构建结果。

有关 flapMap 的更多信息:When do you use map vs flatMap in RxJava?