Merge branch 'ondispose-query-cache-invalidation'

This commit is contained in:
Daniel Compton 2017-11-24 16:53:25 +13:00
commit 7fc9cb6409
2 changed files with 17 additions and 9 deletions

1
checkouts/re-frame-trace Symbolic link
View File

@ -0,0 +1 @@
../../re-frame-trace/

View File

@ -1,7 +1,7 @@
(ns re-frame.subs (ns re-frame.subs
(:require (:require
[re-frame.db :refer [app-db]] [re-frame.db :refer [app-db]]
[re-frame.interop :refer [add-on-dispose! debug-enabled? make-reaction ratom? deref? dispose! reagent-id]] [re-frame.interop :refer [add-on-dispose! debug-enabled? make-reaction ratom? deref? dispose! reagent-id ratom]]
[re-frame.loggers :refer [console]] [re-frame.loggers :refer [console]]
[re-frame.utils :refer [first-in-vector]] [re-frame.utils :refer [first-in-vector]]
[re-frame.registrar :refer [get-handler clear-handlers register-handler]] [re-frame.registrar :refer [get-handler clear-handlers register-handler]]
@ -15,7 +15,7 @@
;; De-duplicate subscriptions. If two or more equal subscriptions ;; De-duplicate subscriptions. If two or more equal subscriptions
;; are concurrently active, we want only one handler running. ;; are concurrently active, we want only one handler running.
;; Two subscriptions are "equal" if their query vectors test "=". ;; Two subscriptions are "equal" if their query vectors test "=".
(def query->reaction (atom {})) (def query->reaction (ratom {}))
(defn clear-subscription-cache! (defn clear-subscription-cache!
"Causes all subscriptions to be removed from the cache. "Causes all subscriptions to be removed from the cache.
@ -44,14 +44,21 @@
[query-v dynv r] [query-v dynv r]
(let [cache-key [query-v dynv]] (let [cache-key [query-v dynv]]
;; when this reaction is no longer being used, remove it from the cache ;; when this reaction is no longer being used, remove it from the cache
(add-on-dispose! r #(do (swap! query->reaction dissoc cache-key) (add-on-dispose! r #(trace/with-trace {:operation (first-in-vector query-v)
(trace/with-trace {:operation (first-in-vector query-v) :op-type :sub/dispose
:op-type :sub/dispose :tags {:query-v query-v
:tags {:query-v query-v :reaction (reagent-id r)}}
:reaction (reagent-id r)}} (swap! query->reaction
nil))) (fn [query-cache]
(if (and (contains? query-cache cache-key) (identical? r (get query-cache cache-key)))
(dissoc query-cache cache-key)
query-cache)))))
;; cache this reaction, so it can be used to deduplicate other, later "=" subscriptions ;; cache this reaction, so it can be used to deduplicate other, later "=" subscriptions
(swap! query->reaction assoc cache-key r) (swap! query->reaction (fn [query-cache]
(when debug-enabled?
(when (contains? query-cache cache-key)
(console :warn "re-frame: Adding a new subscription to the cache while there is an existing subscription in the cache" cache-key)))
(assoc query-cache cache-key r)))
(trace/merge-trace! {:tags {:reaction (reagent-id r)}}) (trace/merge-trace! {:tags {:reaction (reagent-id r)}})
r)) ;; return the actual reaction r)) ;; return the actual reaction