【问题标题】:RxAndroid - execute another request based on a specific result?RxAndroid - 根据特定结果执行另一个请求?
【发布时间】:2016-11-07 16:15:06
【问题描述】:

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

提前致谢

【问题讨论】:

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


【解决方案1】:

假设所有这些方法都返回 observables,你可以这样写:

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

没有复古 lambda;你可以写:

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

【讨论】:

  • Android 不支持 Lambda 表达式
  • 如果可以的话,我会推荐使用retro-lambda!否则创建一个匿名类来替换这个 lambda 并不难。
【解决方案2】:

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

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

创建从第一个结果到第二个 observable 的映射,在这里您可以使用第一个函数的结果将其输入到第二个。

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

现在您必须创建调用链和 flatMaps:进行第一次调用,并使用您刚刚创建的函数对生成的 Observable 进行平面映射。这将再次返回一个 Observable。您可以将其与其他平面图链接在一起

isUserEligible().flatMap(registerFunc);

请注意,您的所有函数都需要返回 Observables 才能实现。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2014-02-02
    • 2018-05-03
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多