Something like this: (defn component [data owner] (reify om/IInitState (init-state [_] (let [chan (chan)] {:chan chan :kill (chan) :pub (pub chan first)}))
om/IWillMount (will-mount [_] (let [pub (om/get-state owner :pub) chan (chan) kill (om/get-state owner :kill)] ; If using pub/sub, need to subscribe *(sub pub :foo chan) * (go-loop [] (let [*[v c]* *(alts! [chan kill])*] (when-not *(= c kill)* (do-something v) (recur)) ; If using pub/sub, need to unsubscribe: *(unsub pub :foo chan)*)))) om/IWillUnmount (will-unmount [_] *(put! (om/get-state owner :kill) :quit)*) om/IRenderState (render-state [_ {:keys [chan]}] (dom/div {:onClick #(put! chan [:foo "Hello"])} "Click me to send [:foo \"Hello\"]")))) On 30 August 2014 16:08, Dhruv Bhatia <dh...@dhruvbhatia.com> wrote: > On Sunday, 13 July 2014 01:46:41 UTC+10, Daniel Kersten wrote: > > Channels are cheap, but unless they get garbage collected (and I assume > not closing them will prevent this), they will still take up some resources. > > > > > > Related and important is that you shut down any go blocks that you > create in IWillMount, especially if they take from a channel which may > still be receiving data (eg: through mux or pub/sub). If you don't shut > these down, they will continue to run even after the component has > unmounted and if the component is later mounted again, you will have > multiple go blocks doing the same thing! Besides using resources, this can > actually be dangerous if you are accessing owner inside the go block (eg to > set local state) as you may end up accessing an unmounted owner. The > simplest solution is having a kill channel that you listen on using > async/alt that gets closed in the IWillUnmount and that terminates the go > block. > > Thanks for the explanation. Would you be able to provide a code example > that demonstrates how to properly clean up a pub/sub watcher within a > component's IWillUnmount lifecycle method? > > -- > Note that posts from new members are moderated - please be patient with > your first post. > --- > You received this message because you are subscribed to the Google Groups > "ClojureScript" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojurescript+unsubscr...@googlegroups.com. > To post to this group, send email to clojurescript@googlegroups.com. > Visit this group at http://groups.google.com/group/clojurescript. > -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojurescript+unsubscr...@googlegroups.com. To post to this group, send email to clojurescript@googlegroups.com. Visit this group at http://groups.google.com/group/clojurescript.