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
clockis not passed, sample will be trigged on everysourceupdate. - If the
fnis passed, pass value fromsourcethrough before passing totarget - If the
targetis not passed, create it and return fromsample()
Schema#

Type of the created target#
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
clockin the rows - Match the column and the row
For example:
sample({clock?, source, fn?, target?, greedy?})#
Arguments
params (Object): Configuration object
clock?: Unit or array of units- If event or effect: trigger
targetupon event or effect is called - If store: trigger
targetupon store is updated - If array of units: trigger
targetupon any given unit is called or updated. Shorthand for inline merge call - If not passed:
sourceis used asclock
- If event or effect: trigger
source?: Unit or object/array with stores- If event or effect: take last invocation argument value. That event or effect must be invoked at least once
- If store: take current state of given store
- If array or object with stores: take values from given stores combined to object or array. Shorthand for inline combine call
- If not passed:
clockis used assource
target?: Unit or array of units- If event or effect: call given event or effect upon
clockis triggered - If store: update given store upon
clockis triggered - If array of units: trigger every given unit upon
clockis triggered - If not passed: new unit will be created under the hood and will be returned as result of the
sample()call. Type of created target is described in table beyond
- If event or effect: call given event or effect upon
fn?((sourceData, clockData) => result): Combinator function, which will transform data fromsourceandclockbefore passing it totarget, should be pure. If not passed, data fromsourcewill be passed totargetas it isgreedy?(boolean) 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. ifgreedyistrue,samplerwill fire on trigger of every node, linked to clock, whereasnon-greedy sampler(greedy: false)will fire only upon the last linked node trigger
note
Array of units in target are supported since effector 21.8.0
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: Source unit- If event or effect. Take last invocation argument value. That event or effect must be invoked at least once
- If store. Take current store`s state
clockUnit: Clock unit. If not passed,sourceis used as clock- If event or effect. Trigger sampled unit, upon event or effect is called
- If store. Trigger 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 inwatchmethod 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({name?})#
since
effector 20.4.0
Every unit in effector may have a name.
You now can name sampled entities in the same manner as basic ones.
Objects and arrays of Store in sample({ source })#
Object of stores#
since
effector 20.8.0
sample can be called with object of Store as source:
Array of stores#
since
effector 20.8.0
sample can be called with array of Store as source:
Support array in clock#
since
effector 21.2.0
Support for sample clock field which acts like a merge call