使用一个Observable为另一个Observable计时

时间:2015-09-28 17:58:37

标签: rx-java

我们需要"时钟"一个基于另一个的热观察,例如:

 main:            --(1)-----(2)-----(3)-----(4)-------(5)----(6)------------|
 clock:           -------(X)------------(X)------(X)--------------(X)-------|
______________________________________________________________________________

 expected result: -------(1)(2)-----(3)-(3)-(4)--(4)--(5)----(6)--(6)-------|

更具体地说,每当"时钟"发出一个项目,再次发出另一个observable中的最后一项。项目排放被延迟,直到两个观察者都发出至少一个项目。 现在,我们以下列方式实现这一目标:

  <T, U> Observable<T> clock(Observable<T> main, Observable<U> clock) {
    return Observable.combineLatest(main, clock, (mainItem, clockItem) -> mainItem);
  }

这似乎有些愚蠢,因为我们正在应用转换,然后只丢弃其中一个输入。此外,我们偶尔会遇到这种解决方案的背压问题。 似乎会有一个现有的Rx运算符执行此操作,但到目前为止,我还没有找到正确的API方法。 有没有更好的,更惯用的方法来解决RxJava这个问题?

1 个答案:

答案 0 :(得分:2)

对我来说很好看。并不是clock输入没有被使用,因为虽然没有使用该值,但是时间有。

要处理热源背压,您可能需要应用其中一个onBackpressureXXX运算符。例如,如果您不想错过输出,请使用.onBackpressureBuffer()。另一种策略是使用.throttle.sample