【问题标题】:Exit Observable.zip in rxjava based on condition根据条件退出 rxjava 中的 Observable.zip
【发布时间】:2019-01-28 18:17:52
【问题描述】:

在 RXJava 中,我有 2 个 observables,它们是来自 2 个下游调用的响应。一个下游调用是一个长轮询调用,另一个是一个短调用并立即返回。 我正在使用 Observable.zip 来组合两个响应的响应。下面的代码可以正常工作。

Observable
 .zip(observable1, observable2)
 .flatMap(update -> foo(update));

现在我要实现的是,如果短下游调用 (observable1) 的输出不包含特定值,则跳过 zip,即不要等待较长下游调用 (observable2) 的输出。 我尝试以下面的方式实现它,但如果条件为真,它不会与 observable2 一起压缩,但它甚至不会发出 observable1 响应。

Observable finalresponse = observable1
                .takeWhile(obsResponse1 ->  checkIfValueExist(obsResponse1))
                .zipWith(observable2,  (observable1, observable2) -> execute(observable1, observable2))
                .flatMap(update -> main.execute(update));

【问题讨论】:

  • 你为什么要进行并行调用?为什么不先调用最短的下游调用,检查值并在此基础上进行长调用
  • 这些只是该区域发出的几个调用中的两个。为了优化,我不能有这些序列。
  • 在你的情况下,顺序调用会更高效,因为你一开始就不会为第二次调用占用内存。

标签: java rx-java rx-java2


【解决方案1】:

在 zip 中有一条规则,只有当两个流都发出一个项目时它才会返回,所以如果你的对象不是你期望的或者你可以做的,你需要做的是过滤或返回 Observable.empty() 到 observable使用过滤器

   Observable
            .zip(Observable.just(1).filter(integer -> integer==1), Observable.just(2).filter(integer -> integer==3),(integer, integer2) -> integer)
            .flatMap(update -> foo(update));

【讨论】:

  • 我所做的如下。但不知何故,如果第一个 checkIfValueExist 返回 false,执行的控制似乎被卡住了,我觉得正在等待第二个响应。 Observable finalresponse = Observable .zip(observable1.filter(obs1rep-> checkIfValueExist(obs1rep))), observable2, (obs1, obs2) -> execute(obs1, obs2)) .flatMap(update -> main.execute(update));
  • 如果你想处理流尝试使用 Observable.error() 并且如果结果为 false 它会自动停止流
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多