This commit is contained in:
Mike Thompson 2018-01-11 20:16:54 +11:00
commit 7a20fd767b
8 changed files with 49 additions and 20 deletions

View File

@ -5,6 +5,14 @@
- add `purge-event-queue` to the API. See https://github.com/Day8/re-frame-test/issues/13 for motivation.
- added [a new FAQ entry](/docs/FAQs/DoINeedReFrame.md) Reagent looks terrific. Why do I need re-frame?
#### Changed
- Debounce trace callbacks to handle larger batches of traces at once, to improve efficiency.
#### Fixed
- Handle js/performance not being defined in NodeJS. [#439](https://github.com/Day8/re-frame/pull/439)
## 0.10.2 (2017.10.07)
#### New Features

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

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

View File

@ -18,6 +18,7 @@ Please add to this list by submitting a pull request.
### Examples and Applications Using re-frame
* [RealWorld](https://github.com/jacekschae/conduit) - heavily inspired by [todomvc](https://github.com/Day8/re-frame/tree/master/examples/todomvc) - well commented codebase with CRUD, auth, advanced patterns, etc) that adheres to the [RealWorld](https://github.com/gothinkster/realworld) spec and API.
* [BlueGenes](https://github.com/intermine/bluegenes) - searching and analysing genomic data, by the University of Cambridge
* [Memento](https://gitlab.com/Numergent/memento) a private note-taking app. Uses compojure-api, PostgreSQL and token auth.
* [RealWord](https://github.com/polymeris/re-frame-realword-example-app) has CRUD, auth. Adheres to [RealWorld](https://github.com/gothinkster/realworld) spec and API.
@ -66,6 +67,8 @@ Please add to this list by submitting a pull request.
* [Stately: State Machines](https://github.com/nodename/stately) also https://www.youtube.com/watch?v=klqorRUPluw
* [re-learn](https://github.com/oliyh/re-learn) - Data driven tutorials for educating users of your reagent / re-frame app
* [subgraph](https://github.com/vimsical/subgraph) - Reactive graph database for re-frame
* [re-graph](https://github.com/oliyh/re-graph) - GraphQL client for re-frame
* [martian](https://github.com/oliyh/martian) - Swagger-compatible API client that abstracts away from HTTP with [re-frame bindings](https://github.com/oliyh/martian/tree/master/re-frame)
#### Debugging

View File

@ -5,11 +5,11 @@ is there in the extra layers and conceptual overhead it brings?
### Answer
Yes, we agree, Reagent is terrific. And, yes, we'd agree that if your application
Yes, we agree, Reagent is terrific. We use it enthusiastically ourselves. And, yes, we'd agree that if your application
is small and simple, then standalone Reagent is a fine choice.
But it does only supplies the V part of the MVC triad. As your application
gets bigger and more complicated, you'll need to find solutions to
But it does only supply the V part of the MVC triad. As your application
gets bigger and more complicated, you *will* need to find solutions to
questions in the M and C realms.
Questions like "where do I put control logic?".

View File

@ -9,8 +9,8 @@ You'll want to investigate CQRS (vs REST).
##### Notes
1. Perhaps watch [Bobby Calderwood's video](https://www.youtube.com/watch?v=B1-gS0oEtYc)
2. Look at his [reference implmentation](https://github.com/capitalone/cqrs-manager-for-distributed-reactive-services) or, perhaps, [this alternative](https://github.com/greywolve/calderwood)
1. Perhaps watch [Bobby Calderwood's video](https://www.youtube.com/watch?v=B1-gS0oEtYc)?
2. Look at his [reference implementation](https://github.com/capitalone/cqrs-manager-for-distributed-reactive-services) or, perhaps, [this alternative](https://github.com/greywolve/calderwood).
4. Be aware that "Event Sourcing" often comes along for the ride
with CQRS, but it doesn't have to. It adds complexity (Kafka?).
Don't do it lightly. Maybe just use CQRS without ES?
@ -20,10 +20,9 @@ You'll want to investigate CQRS (vs REST).
### Further Related Links
Reactive PostgreSQL:
* Reactive PostgreSQL:
https://yogthos.net/posts/2016-11-05-LuminusPostgresNotifications.html
Datalog All The Way Down
* Datalog All The Way Down:
https://www.youtube.com/watch?v=aI0zVzzoK_E

View File

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

View File

@ -38,7 +38,9 @@
(js/setTimeout f ms))
(defn now []
(if (exists? js/performance.now)
(if (and
(exists? js/performance)
(exists? js/performance.now))
(js/performance.now)
(js/Date.now)))

View File

@ -4,8 +4,9 @@
#?(:cljs (:require-macros [net.cgrand.macrovich :as macros]
[re-frame.trace :refer [finish-trace with-trace merge-trace!]]))
(:require [re-frame.interop :as interop]
[re-frame.loggers :refer [console]]
#?(:clj [net.cgrand.macrovich :as macros])
[re-frame.loggers :refer [console]]))
#?(:cljs [goog.functions])))
(def id (atom 0))
(def ^:dynamic *current-trace* nil)
@ -22,6 +23,7 @@
trace-enabled?)
(def trace-cbs (atom {}))
(defonce traces (atom []))
(defn register-trace-cb
"Registers a tracing callback function which will receive a collection of one or more traces.
@ -45,19 +47,32 @@
:child-of (or child-of (:id *current-trace*))
:start (interop/now)})
(defn debounce [f interval]
#?(:cljs (goog.functions/debounce f interval)
:clj (f)))
(def run-tracing-callbacks!
(debounce
(fn []
(doseq [[k cb] @trace-cbs]
(try (cb @traces)
#?(:clj (catch Exception e
(console :error "Error thrown from trace cb" k "while storing" @traces e)))
#?(:cljs (catch :default e
(console :error "Error thrown from trace cb" k "while storing" @traces e))))
(reset! traces [])))
50))
(macros/deftime
(defmacro finish-trace [trace]
`(when (is-trace-enabled?)
(let [end# (interop/now)
duration# (- end# (:start ~trace))]
(doseq [[k# cb#] @trace-cbs]
(try (cb# [(assoc ~trace
(swap! traces conj (assoc ~trace
:duration duration#
:end (interop/now))])
#?(:clj (catch Exception e#
(console :error "Error thrown from trace cb" k# "while storing" ~trace e#)))
#?(:cljs (catch :default e#
(console :error "Error thrown from trace cb" k# "while storing" ~trace e#))))))))
:end (interop/now)))
(run-tracing-callbacks!))))
(defmacro with-trace
"Create a trace inside the scope of the with-trace macro