import { guard } from "effector";Deprecated
Since effector 23.0.0.
The core team recommends using sample instead of guard.
Method for conditional event routing.
It provides a way to control one dataflow with the help of another: when the condition and the data are in different places, we can use guard with stores as filters to trigger events when condition state is true, thereby modulate signals without mixing them.
Methods
guard({ clock?, source?, filter, target? })
Formulae
guard({ clock?, source?, filter, target? }): targetinfo
Either clock or source is required
When clock is triggered, check filter for truthy and call target with data from source if true.
- If
clockis not passed,guardwill be triggered on everysourceupdate - If
sourceis not passed, calltargetwith data fromclock - If
targetis not passed, create Event with type ofsourceand return it fromguard() - If
filteris Store, check it value for truthy - If
filterisFunction, call it with data fromsourceand check result for truthy
since
clock in guard is available since effector 21.8.0
guard({source, filter, target?})
Arguments
params(Object): Configuration object
Returns
Event, which fires upon clock trigger
Examples
Basic
import { createStore, createEffect, createEvent, guard } from "effector";
const clickRequest = createEvent();const fetchRequest = createEffect((n) => new Promise((rs) => setTimeout(rs, 2500, n)));
const $clicks = createStore(0).on(clickRequest, (x) => x + 1);const $requestsCount = createStore(0).on(fetchRequest, (x) => x + 1);
const $isIdle = fetchRequest.pending.map((pending) => !pending);
/*1. on clickRequest2. if $isIdle is true3. take current $clicks value4. and call fetchRequest with it*/guard({ clock: clickRequest /* 1 */, filter: $isIdle /* 2 */, source: $clicks /* 3 */, target: fetchRequest /* 4 */,});See ui visualization
Function predicate
import { createEffect, createEvent, guard } from "effector";
const submitForm = createEvent();const searchUser = createEffect();
guard({ source: submitForm, filter: (user) => user.length > 0, target: searchUser,});
submitForm(""); // nothing happenssubmitForm("alice"); // ~> searchUser('alice')guard(source, {filter: booleanStore})
Arguments
source(Store/Event/Effect): Source unit. Will trigger givenguardon updatesfilter(Store): Filter store
Examples
Store filter
import { createEvent, createStore, createApi, guard } from "effector";
const trigger = createEvent();const $unlocked = createStore(true);
const { lock, unlock } = createApi($unlocked, { lock: () => false, unlock: () => true,});
const target = guard(trigger, { filter: $unlocked,});
target.watch(console.log);trigger("A");lock();trigger("B"); // nothing happensunlock();trigger("C");guard(source, {filter: predicate})
Arguments
source(Store/Event/Effect): Source unit. Will trigger givenguardon updatesfilter((payload) => Boolean): Predicate function, should be pure
Examples
Predicate function
import { createEvent, guard } from "effector";
const source = createEvent();const target = guard(source, { filter: (x) => x > 0,});
target.watch(() => { console.log("target called");});
source(0);// nothing happenssource(1);// target called