RxJava将Observable与另一个带有超时的可选Observable相结合

时间:2017-01-20 11:24:12

标签: java timeout rx-java

假设我们有两个可观察量ABA肯定会发布结果,而B的结果可能根本不会发布(超时)。

问题是,如果A在时间范围内返回,如何映射BB的结果,否则只返回A的结果。

Observable<DatabaseObject> A = getDatabaseElement();
Observable<NetworkObject> B = restApi.getElement();

地图示例:

map((databaseObject, networkObject) => {
  databaseObject.setData(networkObject);
  return databaseObject;
})

2 个答案:

答案 0 :(得分:1)

为了使用时间参数超时B可观察的使用take运算符:

B.take(10, TimeUnit.SECONDS)

要接收AB(如果B在超时时准备就绪),请使用concatWith

A.concatWith(B.take(10, TimeUnit.SECONDS))
    .takeLast(1)

如果您希望合并AB(可选择将AB合并):

A.concatWith(B.take(10, TimeUnit.SECONDS))
    .reduce((a, b) -> a.setData(b))

如果AB属于不同类型(可选择AB):

Observable.combineLatest(
    A,
    B.take(10, TimeUnit.SECONDS).defaultIfEmpty(stubB)),
    (a, b) -> { if (b != stubB) a.setData(b); }
)

答案 1 :(得分:0)

您可能希望在此处采用不同的方法。有一个运算符专为您描述的行为而设计。看看.timeout(long time, TimeUnits units, Observable backupObservable)指示流从原始observable(在您的情况B中,我假设的网络请求)切换到备份A observable,当原始流中没有指定数量的其他项时时间。