从另一个可观察的无限观察

时间:2015-05-15 01:26:13

标签: java rx-java

我有一个Observable,表示从DB表中选择的序列, 所以它是有限的。

Observable<Item> selectResults() { ... }

我想用指定的间隔实现拉动,所以最后我会得到另一个observable,它将包裹我原来的并无限期地拉动。

我只是不知道该怎么做:(

好的,这是我的想法,以间隔可观察的方式建模,可能需要错误处理和取消订阅逻辑。

public class OnSubscribePeriodicObservable implements OnSubscribe<Item> {
...

  @Override
  public void call(final Subscriber<? super Item> subscriber) {
      final Worker worker = scheduler.createWorker();
      subscriber.add( worker );

      worker.schedulePeriodically(new Action0() {
          @Override
          public void call() {
    selectResults().subscribe( new Observer<Item>() {
            @Override
            public void onCompleted() {
              //continue
            }

            @Override
            public void onError(Throwable e) {
              subscriber.onError( e );
            }

            @Override
            public void onNext(Item t) {
              subscriber.onNext( t );
            }
         }); 
          }

      }, initialDelay, period, unit);
}

1 个答案:

答案 0 :(得分:1)

您可以使用标准运算符完成此操作,这将为您提供便宜的错误传播,取消订阅和背压:

Observable<Integer> databaseQuery = Observable
    .just(1, 2, 3, 4)
    .delay(500, TimeUnit.MILLISECONDS);

Observable<Integer> result = Observable
        .timer(1, 2, TimeUnit.SECONDS)
        .onBackpressureDrop()
        .concatMap(t -> databaseQuery);

result.subscribe(System.out::println);

Thread.sleep(10000);