2

背景

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

问题

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

public interface RetrofitRestService {

    @GET("...")
    Observable<Object> A();

    @GET("...")
    Observable<Object> B();
}

我正在寻找可用于我的任务但没有任何运气的Observable 运算符。我可以想象这样的操作员:

RetrofitRestServices service;
service.A().ifSuccessfull(B());

//OR
service.A().ifWasNotEmpty(B());

//OR
service.A().useCondition(new Condition(){ ... }, B());
4

2 回答 2

3

如果你想调用A,然后调用B,你可以使用操作符concat:如果A完成,B会被调用。

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

但是如果 A return null, B 将被调用。

如果是这种情况,那么这个答案会更好:https ://stackoverflow.com/a/28685808/476690

评论后编辑

如果你想使用A()thenflatMap运算符的结果是你需要的

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你什么时候在 RxJava 中使用 map 和 flatMap?

于 2015-02-24T09:18:29.427 回答
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() 不发出任何内容时才为真。这就是为什么如果 A() 发出一个项目,过滤器检查结果是否isEmpty将通过并flatMap调用将,从而调用 B()。

于 2015-02-23T23:49:06.530 回答