Thanks Daniel. On 30 Oct 2014 21:37, "Daniel Kersten" <[email protected]> wrote:
> There was some discussion about this here > https://groups.google.com/forum/#!topic/clojurescript/_a5dPeElqG4 which > might help get you started. > > What I do is basically something like this (untested so may need some > work): > > (defmixin listener > (will-unmount [owner] > (async/close! (om/get-state owner :listener-chan))) > (listen [owner callback] > (let [my-chan (async/chan)] > (go-loop [] > (if-let [data (async/<! my-chan)] > (callback data) > (recur))) > (om/set-state! owner :listener-chan my-chan) > (async/tap global-mult my-chan))) ; note #1 > > and used like this: > > (defcomponentk test-component [] > (:mixins listener) > (will-mount [_] > (listen (fn [data] (println "Got data:" data)) > ...) > > Then instead of calling om/build, you would do (->test-component data) > > note #1: > global-mult is obtained using (async/mult sender-ch), where sender-ch is > the channel you put data on that you want to distribute to your components. > How sender-ch and global-mult is passed to your components is up to you > (you could use Om's shared state, for example). > > Also, you don't have to use a mult if you don't want to multicast data to > all your listeners (or you could use many purpose-specific mults and pass > it into listen). In my real code I use pub/sub. > > Hopefully this will give you some ideas to get you started. > > On 30 October 2014 20:33, Colin Yates <[email protected]> wrote: > >> I assumed so but thought I should check that there wasn't some fancy >> garbage collection thing happening. >> >> Do you happen to have a quick example of how to use the om-tools mixin >> to automatically unsubscribe? >> >> Thanks! >> >> On 30 October 2014 20:24, Daniel Kersten <[email protected]> wrote: >> > Yes, you should terminate the go block in will-unmont, otherwise if your >> > component is mounted multiple times, you will end up with multiple go >> blocks >> > consuming from the channel. If you are transacting on a cursor, then >> this >> > will just eat up resources, but if you are accessing owner (eg to >> get/set >> > local state) then you also risk accessing stale react components. >> > >> > I personally use an om-tools mixin to handle both subscribing and >> > unsubscribing to core.async pubs. This way I don't have to remember to >> > unsubscribe in unmount myself. >> > >> > On 30 October 2014 18:01, Colin Yates <[email protected]> wrote: >> >> >> >> (om/core.async newbie warning) >> >> >> >> I see a common pattern (including in the om tutorials) of using >> channels >> >> to communicate. Specifically I see code similar to: >> >> >> >> [code] >> >> om/IWillMount >> >> (will-mount [_] >> >> (let [nav (om/get-shared owner :nav-chan)] >> >> (go (loop [] >> >> (let [page (<! nav)] >> >> (om/transact! app :page (fn [x] page)) >> >> (recur)))) >> >> [/code] >> >> >> >> What happens when that component is unmounted? Do I need to stop >> listening >> >> to that channel and if so how do I do that? >> >> >> >> I am not claiming there is a problem, I am simply asking if there is a >> >> potential problem and for clarity on the mechanics. >> >> >> >> For context, I am mounting/unmounting quite a bit as they navigate >> through >> >> the app. >> >> >> >> Thanks! >> >> >> >> -- >> >> 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 [email protected]. >> >> To post to this group, send email to [email protected]. >> >> 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 a topic in the >> > Google Groups "ClojureScript" group. >> > To unsubscribe from this topic, visit >> > https://groups.google.com/d/topic/clojurescript/XTdL_KHuvG8/unsubscribe >> . >> > To unsubscribe from this group and all its topics, send an email to >> > [email protected]. >> > To post to this group, send email to [email protected]. >> > 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 [email protected]. >> To post to this group, send email to [email protected]. >> 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 a topic in the > Google Groups "ClojureScript" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojurescript/XTdL_KHuvG8/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/clojurescript.
