【问题标题】:RxJava combine Observable with another optional Observable with timeoutRxJava 将 Observable 与另一个可选的 Observable 与超时相结合
【发布时间】:2017-01-20 11:24:11
【问题描述】:

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

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

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

地图示例:

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

【问题讨论】:

    标签: java timeout rx-java


    【解决方案1】:

    为了使B observable 超时,请使用带有时间参数的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 属于不同类型(可选用B 丰富A):

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这不是我需要的用例。我总是想返回As 结果,但可以选择使用来自B 的数据来丰富它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多