RxAndroid - 根据特定结果执行另一个请求?

时间:2016-11-07 16:15:06

标签: java android rx-java restful-architecture rx-android

我是第一次使用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().

提前致谢

2 个答案:

答案 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以使其成为可能。