我想在我的api上使用一个方法来返回Observable< Observable< Object>>但是我希望一旦所有包含的Observable都已完成,该方法中的代码就会知道它可以关闭一些东西。这样做的最佳方式是什么?
更明确一点,我要完成这个方法:
public static <T> Observable<Observable<T>> doWhenAllComplete(
final Observable<Observable<T>> original, Action0 action) {
...
}
答案 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个源,但你可以创建一个接收源列表并合并所有源的函数。