2016-11-07 31 views
0

我第一次使用RxAndroid/RxJava并试图找出如何实现一系列请求,但每个下一个请求取决于另一个请求的结果。RxAndroid - 根据特定结果执行另一个请求?

例如:

private Boolean isUserEligible(){ 
     .. 
    } 

    private String registerDevice() 
     .. 
    } 

    private String login(){ 
     .. 
    } 

据我所知,可观察可以由一个像下面只执行上述所有方法或者一个:

// Fetch from both simultaneously 
    Observable<String> zipped 
      = Observable.zip(isUserEligible(), registerDevice(),login(), new Func2<String, String, String>() { 

    }); 

    Observable<String> concatenated = Observable.concat(isUserEligible(), registerDevice(),login());  

如果我想要做的事像事先此

//execute usUserEligible first and if eligible, execute registerDevice, else execute login(). 

感谢

+0

看看这个:HTTP://stackoverflow.com/questions/36713433/rxandroid-response-of-one-call-to-make-another-request – aminner

回答

1

这是一个平面地图的用例。

http://reactivex.io/documentation/operators/flatmap.html

从创建的第一个结果映射到第二观察到,在这里你可以使用第一个函数的结果输入到它的第二位。

final Func1<Boolean, Observable<String>> registerFunc = isEligible -> { 
    return registerDevice(isEligible) 
}; 

现在你必须创建您的通话和flatMaps的链条:做第一个呼叫,并flatmap所产生的可观测与您刚刚创建的功能。这将再次返回一个Observable。你可以保持与其他flatmaps

isUserEligible().flatMap(registerFunc); 

要知道,所有的功能需要返回观测量,使这成为可能链接在这里它。

2

假设所有的这些方法都返回观测,你可以写:

Observable<String> response = isUserEligible() 
     .flatMap(isEligible -> isEligible ? registerDevice() : login()); 

没有复古的λ;你可以写:

Observable<String> response = isUserEligible() 
     .flatMap(new Func1<Boolean, Observable<String>>() { 
      public Observable<String> call(final Boolean isEligible) { 
       return isEligible ? registerDevice() : login(); 
      } 
     }); 
+0

的Android犯规支持Lambdan表达 – jonney

+0

如果可以的话,我会推荐使用retro-lambda!否则,不难创建一个匿名类来替换这个lambda。 – flakes

相关问题