RxJava如何获取第一单的价值来完成?

时间:2018-03-06 15:25:23

标签: rx-java

我有两个单打定义如下。

Single<User> userSingleA = Single
    .fromCallable(()-> {
            // Function fetching user data from mirror A
            return user;
        });

Single<User> userSingleB = Single
    .fromCallable(()-> {
            // Function fetching user data from mirror B
            return user;
        });

两者都表示用于获取用户对象的HTTP GET请求。唯一的区别是他们正在与两个不同的镜像服务器通信。我想以某种方式组合两个单曲,使得最终单个将具有返回的用户对象,其中镜像是最快的。一旦其中一个传递并忽略另一个,它就应该取值。

Single<User> userSingle = takeFirstResponse(userSingleA, userSingleB);

甚至可以使用RxJava执行此操作吗?如果是,那怎么样?

1 个答案:

答案 0 :(得分:2)

您可以使用的运算符为amb

  

给定两个或多个源Observable,仅从第一个Observable中发出所有项目以发出项目或通知

Single<User> userSingle = Single.amb(userSingleA, userSingleB);

注意: Single.amb()仅适用于,对于,您必须将源单曲转换为可观察数据

Single<User> userSingle = Observable.amb(userSingleA.toObservable(), userSingleB.toObservable)
                                    .toSingle()

或使用合并

Single<User> userSingle = Single.merge(userSingleA, userSingleB)
                                .first()
                                .toSingle()