Skip to content

CombineLatestDelayError emits error before all inner observables emit result #4414

Closed
@UMFsimke

Description

@UMFsimke

Recently I came across following issue while using combineLatestDealyError operator. This code has been tested on Android, Nexus 5x running OS 6.0.1.

Observable<Boolean> errorObservable = Observable.create(subscriber -> {
    subscriber.onError(new NullPointerException());
});

Observable timeoutObservable = Observable.create(subscriber -> {
    subscriber.onNext(true);
    subscriber.onCompleted();
})
.delay(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.doOnNext(result -> Log.d("Combine", "Delay emitted"));

Observable<Object> zippedObservable = Observable.zip(
        Observable.just(true), timeoutObs,
        (flag1, flag2) -> {
            Log.d("Combine", "On Zip emitted");
            return new Object();
        });

return Observable.combineLatestDelayError(
        Arrays.asList(errorObservable, zippedObservable),
        result -> {
            Boolean flag1 = (Boolean) result[0];
            Object object = result[1];
            Log.d("Combine", "Result of errorObservable: " + flag1);
            Log.d("Combine", "Result of zippedObservable: " + object);
            return null;
        }).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<Object>() {
            @Override
            public void onCompleted() {
                Log.d("Combine", "OnCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Log.d("Combine", "OnError");
            }

            @Override
            public void onNext(Object o) {
                Log.d("Combine", "OnNext");
            }
        });

This piece of code is trying to simulate callbacks using delays - for example Android Pay availability callback.

Problem here arises once this code is run. The log will be:

OnError
Delay emitted
On Zip emitted

This is quite contradictory to the docs that state that expected behavior should be:

Delay emitted
On Zip emitted
OnError

The expected result does happens if you add subscriber.onNext(true) to the errorObservable before subscriber.onError...

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions