sample
This method can be used for linking two nodes, resulting the third one, which will fire only upon clock
node trigger.
Quite a common case, when you need to handle some event with some store's state. Instead of using store.getState()
, which may cause race conditions and inconsistency of state, it is more suitable to use sample
method.
Formulae
When clock
is triggered, read the value from source
and trigger target
with it.
- If the
clock
is not passed, sample will be trigged on everysource
update. - If the
fn
is passed, pass value fromsource
through before passing totarget
- If the
target
is not passed, create it and return fromsample()
Schema
target
Type of the created If target
is not passed to sample()
call, it will be created internally. The type of the unit is described in the table below:
clock\source | Store | Event | Effect |
---|---|---|---|
Store | Store | Event | Event |
Event | Event | Event | Event |
Effect | Event | Event | Event |
How to read it:
- You need to know type of the
source
, it is a column - Type of the
clock
in the rows - Match the column and the row
For example:
sample({source, clock?, fn?, target?, greedy?})
Arguments
params
(Object): Configuration object
source
(Event | Effect | Store): Source unit.- If event. Take last event invocation argument value. Event must be invoked at least once.
- If effect. Take last effect invocation argument value. Effect must be invoked at least once.
- If store. Take current store`s state.
clock?
(Event | Effect | Store): Clock unit. If not passed, thesource
is used as clock.- If event. Triger sampled unit, upon event is called.
- If effect. Triger sampled unit, upon effect is called.
- If store. Triger sampled unit, upon store is updated.
fn?
((sourceData, clockData) => result): Optional combinator function, should be pure. Since, this handler is supposed to organize data flow, you should avoid declaring side-effects here. It's more appropriate to place it inwatch
method for sampled node.target?
(Event | Effect | Store): can contain Unit, which accepts payload returned byfn
. In case if target is not passed, it's created "under the hood" and being returned as result of thesample()
call.greedy?
(true | false) Modifier defines whether sampler will wait for resolving calculation result, and will batch all updates, resulting only one trigger, or will be triggered upon every linked node invocation, e.g. ifgreedy
istrue
,sampler
will fire on trigger of every node, linked to clock, whereasnon-greedy sampler(greedy: false)
will fire only upon the last linked node trigger.
Returns
(Event | Store) - Unit, which fires/updates upon clock
is trigged, if source
is not passed.
The type of returned unit depends on the types of clock and source..
Example
sample(sourceUnit, clockUnit, fn?)
It is just another form of the sample
invocation, with the same sense.
Arguments
sourceUnit
(Event | Effect | Store): Source unit.- If event. Take last event invocation argument value. Event must be invoked at least once.
- If effect. Take last effect invocation argument value. Effect must be invoked at least once.
- If store. Take current store`s state.
clockUnit
(Event | Effect | Store): Clock unit. If not passed, thesource
is used as clock.- If event. Triger sampled unit, upon event is called.
- If effect. Triger sampled unit, upon effect is called.
- If store. Triger sampled unit, upon store is updated.
fn?
((sourceData, clockData) => result): Optional combinator function, should be pure. Since, this handler is supposed to organize data flow, you should avoid declaring side-effects here. It's more appropriate to place it inwatch
method for sampled node.
Returns
(Event | Store) - Unit, which fires/updates upon clock
is trigged, if source
is not passed.
The type of returned unit depends on the types of clock and source..
Example
sample({ source })
Objects and arrays of Store in Object of stores
sample
can be called with object of Store as source
:
Array of stores
sample
can be called with array of Store as source
: