合并多個(gè)Observables的發(fā)射物
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/merge.c.png" alt="merge" />
使用Merge操作符你可以將多個(gè)Observables的輸出合并,就好像它們是一個(gè)單個(gè)的Observable一樣。
Merge可能會(huì)讓合并的Observables發(fā)射的數(shù)據(jù)交錯(cuò)(有一個(gè)類似的操作符Concat不會(huì)讓數(shù)據(jù)交錯(cuò),它會(huì)按順序一個(gè)接著一個(gè)發(fā)射多個(gè)Observables的發(fā)射物)。
正如圖例上展示的,任何一個(gè)原始Observable的onError通知會(huì)被立即傳遞給觀察者,而且會(huì)終止合并后的Observable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeDelayError.C.png" alt="mergeDelayError" />
在很多ReactiveX實(shí)現(xiàn)中還有一個(gè)叫MergeDelayError的操作符,它的行為有一點(diǎn)不同,它會(huì)保留onError通知直到合并后的Observable所有的數(shù)據(jù)發(fā)射完成,在那時(shí)它才會(huì)把onError傳遞給觀察者。
RxJava將它實(shí)現(xiàn)為merge, mergeWith和mergeDelayError。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/merge.png" alt="merge" />
示例代碼
Observable<Integer> odds = Observable.just(1, 3, 5).subscribeOn(someScheduler);
Observable<Integer> evens = Observable.just(2, 4, 6);
Observable.merge(odds, evens)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
輸出
Next: 1
Next: 3
Next: 5
Next: 2
Next: 4
Next: 6
Sequence complete.
除了傳遞多個(gè)Observable給merge,你還可以傳遞一個(gè)Observable列表List,數(shù)組,甚至是一個(gè)發(fā)射Observable序列的Observable,merge將合并它們的輸出作為單個(gè)Observable的輸出:
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/merge.io.png" alt="merge" />
如果你傳遞一個(gè)發(fā)射Observables序列的Observable,你可以指定merge應(yīng)該同時(shí)訂閱的Observable'的最大數(shù)量。一旦達(dá)到訂閱數(shù)的限制,它將不再訂閱原始Observable發(fā)射的任何其它Observable,直到某個(gè)已經(jīng)訂閱的Observable發(fā)射了onCompleted通知。
merge是靜態(tài)方法,mergeWith是對(duì)象方法,舉個(gè)例子,Observable.merge(odds,evens)等價(jià)于odds.mergeWith(evens)。
如果傳遞給merge的任何一個(gè)的Observable發(fā)射了onError通知終止了,merge操作符生成的Observable也會(huì)立即以onError通知終止。如果你想讓它繼續(xù)發(fā)射數(shù)據(jù),在最后才報(bào)告錯(cuò)誤,可以使用mergeDelayError。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeDelayError.png" alt="merge" />
mergeDelayError behaves much like merge. The exception is when one of the Observables being merged terminates with an onError notification. If this happens with merge, the merged Observable will immediately issue an onError notification and terminate. mergeDelayError, on the other hand, will hold off on reporting the error until it has given any other non-error-producing Observables that it is merging a chance to finish emitting their items, and it will emit those itself, and will only terminate with an onError notification when all of the other merged Observables have finished.
Because it is possible that more than one of the merged Observables encountered an error, mergeDelayError may pass information about multiple errors in the onError notification (it will never invoke the observer’s onError method more than once). For this reason, if you want to know the nature of these errors, you should write your observers’ onError methods so that they accept a parameter of the class CompositeException.
mergeDelayError has fewer variants. You cannot pass it an Iterable or Array of Observables, but you can pass it an Observable that emits Observables or between one and nine individual Observables as parameters. There is not an instance method version of mergeDelayError as there is for merge.