Ido Barash
Ido Barash

Reputation: 5122

RXJava error handling of multiple Observables

I have a logic that I have to run after fetching some data from other services. How do I handle failure of one or all of them?

I wish to log an error and not throw exceptions

// Step 1
Observable<Provider> providerObservable =
        providerService
                .getProvider(data)
                .toObservable()
                .onErrorResumeNext(e -> Observable.error(e.getCause()));

// Step 2
Single<Profile> profileObservable =
        profileService
                .getProfile(data)
                .onErrorResumeNext(e -> Single.error(e.getCause()));

Observable<ExtendedProfile> extendedProfileObservable =
        profileObservable
                .flatMap(this::getExtendedProfile)
                .toObservable()
                .onErrorResumeNext(e -> Observable.error(e.getCause()));

// Combine
Observable.combineLatest(providerObservable, extendedProfileObservable, this::handleProviderAndProfile)
        .doOnError(throwable -> logError(throwable))
        .onErrorResumeNext(throwable -> Observable.empty())
        .subscribe();

This gets me stuck. Nothing is written to log.

Upvotes: 0

Views: 754

Answers (1)

Ankit Kumar
Ankit Kumar

Reputation: 3723

Observable.combineLatest(
        providerObservable,
        extendedProfileObservable,
        handleProviderAndProfile,
        (providerObservable, extendedProfileObservable, handleProviderAndProfile) -> operationFunction(providerObservable, extendedProfileObservable, handleProviderAndProfile)
)
        .doOnError(throwable -> logError(throwable))
        .onErrorResumeNext(throwable -> Observable.empty())
        .subscribe();

You can try something like above. providerObservable, extendedProfileObservable and handleProviderAndProfile are input for combineLatest and (providerObservable, extendedProfileObservable, handleProviderAndProfile) -> operationFunction(providerObservable, extendedProfileObservable, handleProviderAndProfile) is providing result to lambda. This should be the operation performed on all three inputs.

Upvotes: 3

Related Questions