Skip to content

Question

How do I access the value of a subscription from within an event handler?

The Wrong Way

You should NOT do this:

(re-frame.core/reg-event-db
  :event-id 
  (fn [db v]
    (let [sub-val  @(subscribe [:something])]   ;; <--- Eeek
       ....)))

because that subscribe: 1. might create a memory leak (the subscription might not be "freed") 2. makes the event handler impure (it grabs a global value)

The Better Way

Instead, the value of a subscription should be injected into the coeffects of that handler via an interceptor.

A sketch:

(re-frame.core/reg-event-fx         ;; handler must access coeffects, so use -fx
  :event-id 
  (inject-sub  [:query-id :param])  ;; <-- interceptor will inject subscription value into coeffects
  (fn [coeffects event]
    (let [sub-val  (:something coeffects)]  ;; obtain subscription value 
       ....)))

Notes: 1. inject-sub is an interceptor which will get the subscription value and add it to coeffects (somehow) 2. The event handler obtains the value from coeffects

So, how to write this inject-sub interceptor?

Solutions

re-frame doesn't yet have a builtin inject-sub interceptor to do this injection.

I'd suggest you use this 3rd party library: <https://github.com/vimsical/re-frame-utils/blob/master/src/vimsical/re_frame/cofx/inject.cljc>