观察者的占位符?

时间:2014-11-03 05:17:14

标签: rx-java

假设我有两个Observables A和B. 当服务连接到我的程序时,A发出true。如果服务启动,B将发出true,否则为false。

我想使用combineLatest组合A和B,然后采取适当的行动。

问题是在我连接到服务之前B不可用。所以我的问题是,如果B可用,我是否可以有一个Observable-wrapper och占位符?然后当B可用时,包装器应该发出来自B的值。

3 个答案:

答案 0 :(得分:1)

我提出了一个简单的解决方案。

我创建了一个主题C,就像这样

BehaviorSubject<Boolean> C = BehaviorSubject.create(false);

通过这样做,我能够做到这样的事情

Observable.combineLatest(A, C, bla bla....

然后当B变得可用时,我做

B.subcribe(C);

答案 1 :(得分:0)

也许你可以使用delaySubscription实现这一点。这是一个例子:

ExecutorService executorService = Executors.newCachedThreadPool();
Future<Void> future = executorService.submit(() -> {
  Thread.sleep(3000);
  //service started
  return null;
});
Observable<Void> oFuture = Observable.from(future, Schedulers.newThread());
Observable<Long> oA = Observable.interval(1, TimeUnit.SECONDS);
Observable<Long> oB = Observable.interval(100, TimeUnit.MILLISECONDS);
Observable<Long> delayedObservable = oB.delaySubscription(new Func0<Observable<Void>>() {
  @Override public Observable<Void> call() {
    return oFuture;
  }
});
Observable<String> stringObservable = Observable.combineLatest(oA, delayedObservable, (i1, i2) -> i1 + "-" + i2);
executorService.submit(() -> {
  stringObservable.forEach(System.out::println);
});
Thread.sleep(10000);
executorService.shutdownNow();

答案 2 :(得分:0)

你真正说的是B取决于A.大多数情况下,当你有一个依赖于另一个的可观察量时,你可以使用.flatMap()来表达这种关系。

Observable<Boolean> createObservableA() {
    return ...; // Same as you currently have for creating Observable A.
}

Observable<Boolean> createObservableB() {
    return createObservableA()
        .flatMap(serviceConnected -> {
            if (!serviceConnected) {
                // Don't emit anything to subscribers yet.
                return Observable.empty();
            }

            return ...; // Service is now connected create Observable B.
        });
}