2121
2222import rx .Observable ;
2323import rx .Observable .OnSubscribe ;
24- import rx .Observer ;
2524import rx .Subscriber ;
2625
2726/**
@@ -121,12 +120,12 @@ private static final class AmbSubscriber<T> extends Subscriber<T> {
121120
122121 private static final int NONE = -1 ;
123122
124- private Observer <? super T > observer ;
125- private int index ;
126- private AtomicInteger choice ;
123+ private final Subscriber <? super T > subscriber ;
124+ private final int index ;
125+ private final AtomicInteger choice ;
127126
128- private AmbSubscriber (Subscriber <? super T > observer , int index , AtomicInteger choice ) {
129- this .observer = observer ;
127+ private AmbSubscriber (Subscriber <? super T > subscriber , int index , AtomicInteger choice ) {
128+ this .subscriber = subscriber ;
130129 this .choice = choice ;
131130 this .index = index ;
132131 }
@@ -137,7 +136,7 @@ public void onNext(T args) {
137136 unsubscribe ();
138137 return ;
139138 }
140- observer .onNext (args );
139+ subscriber .onNext (args );
141140 }
142141
143142 @ Override
@@ -146,7 +145,7 @@ public void onCompleted() {
146145 unsubscribe ();
147146 return ;
148147 }
149- observer .onCompleted ();
148+ subscriber .onCompleted ();
150149 }
151150
152151 @ Override
@@ -155,7 +154,7 @@ public void onError(Throwable e) {
155154 unsubscribe ();
156155 return ;
157156 }
158- observer .onError (e );
157+ subscriber .onError (e );
159158 }
160159
161160 private boolean isSelected () {
@@ -180,6 +179,10 @@ public void call(Subscriber<? super T> subscriber) {
180179 if (subscriber .isUnsubscribed ()) {
181180 break ;
182181 }
182+ if (choice .get () != AmbSubscriber .NONE ) {
183+ // Already choose someone, the rest Observables can be skipped.
184+ break ;
185+ }
183186 AmbSubscriber <T > ambSubscriber = new AmbSubscriber <T >(subscriber , index , choice );
184187 subscriber .add (ambSubscriber );
185188 source .subscribe (ambSubscriber );
0 commit comments