Reputation: 1457
Suppose I have a BehaviorProcessor
which contains some value v
.
Now if I want to asynchronously request some data, which would depend on v
I would do it like this:
val res = v.flatMapSingle { asyncRequest(it) }
Now let's log all the invocations of this block (mapper)
val res = v.flatMapSingle {
println("mapper")
asyncRequest(it)
}
It will print mapper
multiple times, which means asyncRequest
is being called multiple times, it seems every time some other dependant stream is being subscribe
d to
I am trying to avoid multiple mapper invocations (thus avoiding multiple asyncRequest
calls).
Is there a way to do so with standard rxjava2 utils?
Upvotes: 0
Views: 68
Reputation: 3253
Use cache()
operator. It will cache result of flatMapSingle
.
BehaviorProcessor<String> v = BehaviorProcessor.create();
Flowable<String> res = v.flatMapSingle(item -> {
System.out.println("mapper");
return asyncRequest(item);
})
.cache();
v.onNext("test");
res.subscribe(s->System.out.println("subscribe1 received: "+ s));
res.subscribe(s->System.out.println("subscribe2 received: "+ s));
v.onNext("test2");
Produces
mapper
mapper
subscribe1 received: test async
subscribe2 received: test async
subscribe1 received: test2 async
subscribe2 received: test2 async
Upvotes: 1