我是第一次使用RxAndroid / RxJava并试图弄清楚如何实现一系列请求,但每个下一个请求都取决于另一个请求的结果。
示例:
private Boolean isUserEligible(){
..
}
private String registerDevice()
..
}
private String login(){
..
}
据我所知,Observable只能执行上述所有方法或逐个执行,如下所示:
// 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 :(得分:2)
假设所有这些方法都返回了observable,你可以写:
Observable<String> response = isUserEligible()
.flatMap(isEligible -> isEligible ? registerDevice() : login());
没有retro-lambda;你可以写:
Observable<String> response = isUserEligible()
.flatMap(new Func1<Boolean, Observable<String>>() {
public Observable<String> call(final Boolean isEligible) {
return isEligible ? registerDevice() : login();
}
});
答案 1 :(得分:1)
这是flatmap的用例。
http://reactivex.io/documentation/operators/flatmap.html
创建从第一个结果到第二个observable的映射,在这里你可以使用第一个函数的结果将它输入到第二个结果中。
final Func1<Boolean, Observable<String>> registerFunc = isEligible -> {
return registerDevice(isEligible)
};
现在你必须创建你的调用链和flatMaps:执行第一次调用,并使用刚刚创建的函数对生成的Observable进行flatmap。这将再次返回一个Observable。你可以用其他平面图将它链接在这里
isUserEligible().flatMap(registerFunc);
请注意,您的所有函数都需要返回Observables以使其成为可能。