…because streams don’t produce side effects until they’re observed, and the stream returned from the Epic is observed at the edges of the system.
But redux-observable sponsors observing midway! Not at the edges. When you do
.mergeMap(() => getJSON()) it’s the .mergeMap that subscribes (hence observes) to the observable, not the edge of the system.
And observing midway does not make things imperative per-se; it’s when observing-midway causes a side-effect that makes things imperative.