2016-11-07 76 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

相關問題