如何检测Observable <observable <object>&gt; </observable <object>中所有包含的Observable的完成情况

时间:2014-01-31 10:01:49

标签: java system.reactive rx-java

我想在我的api上使用一个方法来返回Observable&lt; Observable&lt; Object&gt;&gt;但是我希望一旦所有包含的Observable都已完成,该方法中的代码就会知道它可以关闭一些东西。这样做的最佳方式是什么?

更明确一点,我要完成这个方法:

public static <T> Observable<Observable<T>> doWhenAllComplete(
        final Observable<Observable<T>> original, Action0 action) {
  ...
}

3 个答案:

答案 0 :(得分:2)

道歉,我的答案是在.NET中(就像system.reactive标记一样);我相信你可以翻译它!

如果IObservable<IObservable<Object>>source提供,则:

source.Merge()
      .Subscribe(_  => {}, /* not interested in onNext */
                 () => /* onCompleted action here, called when all complete */);

注意:如果任何流错误(导致合并流在该点终止),这将分解,因此您也可以执行此操作以吞下各个流上的错误:

source.SelectMany(x => x.Catch(Observable.Empty<Object>()))
      .Subscribe(_  => {}, /* not interested in onNext */
                 () => /* onCompleted action here, called when all complete */);

答案 1 :(得分:0)

这个方法的实现似乎没有副作用,我相信:

public static <T> Observable<Observable<T>> doWhenAllComplete(
        final Observable<Observable<T>> original, final Action0 action) {
    return Observable.create(new OnSubscribeFunc<Observable<T>>() {

        @Override
        public Subscription onSubscribe(Observer<? super Observable<T>> o) {
            ConnectableObservable<Observable<T>> published = original
                    .publish();
            Subscription sub1 = Observable.merge(published)
                    .doOnCompleted(action).subscribe();
            Subscription sub2 = published.subscribe(o);
            Subscription sub3 = published.connect();
            return Subscriptions.from(sub1, sub2, sub3);
        }
    });
}

答案 2 :(得分:0)

对我而言,这有效:

bothSources = source1.Cast<Object>().Merge (source2.Cast<Object>());

在我的情况下,我只需要等待2个源,但你可以创建一个接收源列表并合并所有源的函数。