Reputation: 198
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
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