mirror of
https://github.com/status-im/re-frame.git
synced 2025-02-23 15:28:09 +00:00
Improve FAQ
This commit is contained in:
parent
53855f1250
commit
6f0ff876b0
@ -1,43 +1,48 @@
|
||||
### Question
|
||||
|
||||
When the user switches to a certain panel, I'd like to kickoff a regular poll of my
|
||||
backend database - say every 60 seconds.
|
||||
backend (database) - say every 60 seconds.
|
||||
|
||||
And, then later, when the user switches away from that panel, I want to stop that polling.
|
||||
|
||||
How do i do it?
|
||||
How do I do it?
|
||||
|
||||
|
||||
### Before I Answer - An Architectural Note
|
||||
### First, An Architectural Note
|
||||
|
||||
The broader React community often uses the "load data from server on Component mount"
|
||||
model of architecture. They'll often collocate queries with view components and perform a
|
||||
GET (to the server) within the View's `componentDidMount`.
|
||||
model of architecture. They'll collocate queries with view components and perform a
|
||||
GET (to the server) within the View's `componentDidMount`.
|
||||
|
||||
This is not idiomatic re-frame. Views are not imperative in nature (they don't issue
|
||||
database queries), they simply provide a rendering of the current application state.
|
||||
For this and
|
||||
more browse [PurelyFunctional.tv's writeup](https://purelyfunctional.tv/article/react-vs-re-frame/)
|
||||
This approach is not idiomatic for re-frame. Views are not imperative in nature
|
||||
(they don't issue database queries), they simply render current application state.
|
||||
This and more
|
||||
[is discussed in PurelyFunctional.tv's writeup](https://purelyfunctional.tv/article/react-vs-re-frame/)
|
||||
|
||||
Instead, re-frame is CQRS in nature - "stuff" only happens
|
||||
because of an `event`. When the user clicks on a panel-changing widget,
|
||||
an event is dispatched, and it is the handler for this event which knows
|
||||
that X, Y and Z needs to happen (assume one of these letters is "load data from server").
|
||||
re-frame is CQRS in nature - "imperative stuff" only ever happens
|
||||
because of an `event`. When the user clicks on a panel-changing widget (a button or a tab?),
|
||||
an event is dispatched, and it is the event handler for this event which knows
|
||||
that action X, Y and Z needs to happen. X might be change application state so
|
||||
that the view displayed changes, Y might be change application state so that a
|
||||
"twirly thing" is shown over the top, and Z might be to issue a database query.
|
||||
|
||||
So, having got that out the way ...
|
||||
|
||||
### An Answer
|
||||
### Answer
|
||||
|
||||
We'll create an effect. It will general in nature.
|
||||
We'll create an effect. It will be general in nature.
|
||||
|
||||
It will schedule and unschedule the regular dispatch of an event. That
|
||||
event could do the server poll, or ... it could do other things. So
|
||||
this is effect could be used to achieve more than what was asked for
|
||||
in this FAQ.
|
||||
It will start and stop the timed/scheduled dispatch of an event. For this FAQ,
|
||||
this event will poll the backend but this is a general pattern
|
||||
and the regularly dispatched event could do anything we wanted.
|
||||
|
||||
We must first design our `effect` - a data format (micro DSL) returned by an
|
||||
event handler, which specifies the scheduled/regular dispatch. To `:start`
|
||||
a regular dispatch, an event handler would return data in this format:
|
||||
We first create an `effect` called, say, `:interval`. We must
|
||||
design the data format (micro DSL) returned by an
|
||||
event handler for this effect. This data format must allow an event handler to
|
||||
start and stop a regular dispatch.
|
||||
|
||||
To `:start` a regular dispatch, an event handler would return
|
||||
data in this format:
|
||||
```clj
|
||||
{:interval {:action :start
|
||||
:id :panel-1-query ;; my id for this (so I cancel later)
|
||||
@ -45,7 +50,7 @@ a regular dispatch, an event handler would return data in this format:
|
||||
:event [:panel-query 1]}} ;; what to dispatch
|
||||
```
|
||||
|
||||
And to later cancel the regular dispatch, an event handler would do this:
|
||||
And to later cancel the regular dispatch, an event handler would return this:
|
||||
```clj
|
||||
{:interval {:action :cancel
|
||||
:id :panel-1-query}} ;; my id for this (provided to :start)
|
||||
|
Loading…
x
Reference in New Issue
Block a user