代码之家  ›  专栏  ›  技术社区  ›  Amio.io

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

  •  2
  • Amio.io  · 技术社区  · 11 年前

    出身背景

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

    问题

    对于以下两个服务,我想调用服务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());
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    如果你想先打A,然后再打B,你可以使用接线员 concat :如果A完成,将调用B。

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

    但如果A回归 null ,B将被调用。

    如果是这样的话,那么这个答案会更好: 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?

        2
  •  1
  •   meddle    11 年前

    这个呢

    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()发出一个项,过滤器检查 栈空 将通过 flatMap 将被调用,从而调用B()。