【问题标题】:Rx Timeout OperatorRx 超时运算符
【发布时间】:2018-03-14 10:00:00
【问题描述】:

如果没有发出任何项目,我想在 x 秒后发出一个项目。我试图使用超时运算符。问题是超时运算符需要至少执行一项才能开始倒计时。来自文档:

“如果下一个项目没有在从其前身开始的指定超时时间内发出,则生成的 Observable 开始镜像一个备用 Observable。”

这不是我正在寻找的行为。当我订阅我的 observable 时,如果在特定的时间段内过去没有任何发射过的项目,我想发射一个特定的项目。

例子:

 getUserLocationFromGPS() //Sometimes I dont receive user location
.timeout(5, TimeUnit.SECONDS, Observable.just(getDefaultLocation())
.subscribe(...);

【问题讨论】:

  • 也许只是从 getDefaultLocation() 开始?
  • @KrzysztofSkowronek 一开始我不想发出默认位置,这只是后备情况。

标签: rx-java rx-android


【解决方案1】:
final Observable data = yourApi.getData().take(5, TimeUnit.SECONDS);
final Observable fallback = Observable.just("Fallback");

Observable.concat(data, fallback).firstOrError()
            .subscribe(
                    System.out::println
            );
  1. 如果 yourApi.getData() 没有发出任何内容,那么您将从后备 observable 接收数据。

  2. 如果 yourApi.getData() 超时,那么您将从后备 observable 接收数据。

  3. 如果yourApi.getData() 正常发射,那么您将收到来自它的数据。

【讨论】:

  • 嗨,我已经在使用该参数了。我的问题不是那个。你总是发出一个项目,“你好”。就我而言,我之前可能没有发出任何项目,因此超时运算符不会开始倒计时。
  • @VictorManuelPinedaMurcia 那么为了清楚起见,您能否将答案标记为已接受?很高兴为您提供帮助!
【解决方案2】:

我没有专门使用java-rx,但这里有个想法:

getUserLocationFromGPS()
.buffer(5 sec, 1 item) //not sure how to do this in rx-java
.map(x => { // this is select in .net
    if(x.IsEmpty)
      return getDefautLocation();
    else
      return x[0];
    }).Subscribe(...)

buffer 将每 5 秒为您获取项目列表。您可以指定它在 getUserLocationFromGPS() 仅发出 1 个项目后返回

map 将检查列表是否为空(没有发出任何项目)并返回正确的值

【讨论】:

  • 恐怕它不适合我。如果 getUserLocationFromGPS() 没有发出项目,则缓冲区在 5 秒后不会发出空列表。在这种情况下不执行映射运算符。我会坚持本杰明的解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多