Tyvrel
Tyvrel

Reputation: 198

Subscribing to another observable in doOnNext method

I am using ReactiveX 1 (cannot migrate to version 2).

It's just example of the problem, but say I want to save an entity using reactive repository. It returns an observable of saveResult, which is subscribed by layer above (e.g. controller).

But then if the save was successful, I need to send an event. Sending an event is also reactive and returns an Observable. I actually do not care about it's result (there are some logs, and that's it).

I have done it in following way, but it's look a bit ugly, because an Observableception. Is there a way to do it cleaner? I would be satisfied by some Observable<T> peek(rx.functions.Func1<? super T, Observable<?> func), but I was unable to find it

public Observable<Result<Entity>> save(Entity entity){
return entityRepository.saveEntity(entity) //Observable<Result<Entity>>
    .doOnNext(saveResult -> saveResult
        .ifSuccessful(entity -> sendEntityCreatedEvent(entity)) //Observable<Result<EntityCreatedEvent>>
            .subscribe()

}

Thank you,

Tyvrel

Upvotes: 2

Views: 619

Answers (1)

Gent Ahmeti
Gent Ahmeti

Reputation: 1599

I guess you could use a flatMap to run the save Observable, at least this way you don't break the Observable chain.

public Observable<Result<Entity>> save(Entity entity){
return entityRepository.saveEntity(entity) //Observable<Result<Entity>>
    .flatMap(saveResult -> saveResult
        .ifSuccessful(entity -> sendEntityCreatedEvent(entity)) //Observable<Result<EntityCreatedEvent>>
            .map(entity -> saveResult)
    )
}

Since you need the result from the previous Observable just map the result from this Observable to the old result.

Upvotes: 2

Related Questions