How can I understand why my subscriptions are getting disposed? It’s driving me nuts and I’m sure that this question will help me understand laziness better
Subs (which are just Reagent reactions) are disposed of automatically when the last watch on them is removed. Usually it happens when the last view that was using a sub is unmounted.
How does it affect you anyway?
I’m using day8.re-frame/undo, and my :undos? subscription is being disposed on the first undoable event that I dispatch
But I don’t understand why, because I have an undo and a redo button on my app and I don’t think they’re getting unmounted... they do get disabled however. Here’s the tutorial that I’m following where it describes what the buttons are like https://github.com/day8/re-frame-undo#the-result
OK, but how does it affect you? How do you even know that duspose!
(IIRC the function) was called on the reaction?
Ok I figured out how to fix the behavior: could you explain what’s going on though? I had written my button like so: (defn undo-button [] (let [undos? @(subscribe [:undos?])] ;; only enable the button when there's undos (fn [] [:input {:type "button" :value "undo" :disabled (not undos?) :on-click #(dispatch [:undo])}]]))) Note that this deviates from the tutorial slightly, by moving the deref of my subscription into the let binding itself. With my button written this way, the subscription to :undos? gets disposed. When I do it the tutorial’s way instead, ie like so: (defn undo-button [] (let [undos? (subscribe [:undos?])] ;; only enable the button when there's undos (fn [] [:input {:type "button" :value "undo" :disabled (not @undos?) :on-click #(dispatch [:undo])}]]))) I get the correct behavior. Why does moving the @ result in this change of behavior?
The first example uses @
outside of the view function but, I think, within the Reagent's ratom context. It's expected. In short, don't use @
on subs/ratoms/reactions outside of view functions.
Ok I’ll remember that - thanks for your help
What's the plan on re-frame instances there? Should I make a PR? @mikethompson
Or core team wants to do it themselves?
So I have this basic println
effect which I'm trying to dispatch in my init
function start
here renders the root view, but for some reason I'm getting an error re: frame: no :event handler registered for: {"ns":"pokedex.events", "name":"println","fqn":"pokedex.events/println", ...}
. Am I registering the effect incorrectly? I just followed https://github.com/day8/re-frame/blob/master/docs/Effects.md re-frame docs on effects, but tweaked the effect slightly.
::println
in your case is an effect. dispatch
and dispatch-sync
work on events.
Switch ::print
and ::print-effect
in pokedex.events
.
also :println
and ::println
are different values
So I have registered this effect and event which fetches some data from an API which I then conj
onto a vector in my re-frame db which works fine, but it's quite slow for some reason and I'm not exactly sure why. First I thought it was an issue with the component that renders this data, but I made it basically empty to check and it seems that dispatching to ::fetch-pokemons
is the bottleneck.
Your (http/get p-url)
requests are done sequentially, not in parallel.
Also, a small nitpick: you can replace (update db :list #(conj % pokemon))
with (update db :list conj pokemon)
.
I see, how would I make the requests in parallel?
Try using take!
for example. There are innumerable approaches.