C effector 22.2.0 предпочтительнее использовать sample
Добавлен в effector 20.4.0
Метод для запуска юнитов по условию, условием может быть функция-предикат или отдельный стор. Позволяет описывать бизнес-правила независимо от других сущностей.
Типичный вариант использования – когда необходимо запускать события лишь когда в определённом сторе значение равно true. Тем самым обеспечивается управление потоками данных без их смешивания
Формула
guard({clock?, source?, filter, target?}): targetclock или source обязателен
При срабатывании clock, после проверки filter на истинность, вызывается target с данными из source
- Если
clockне передан,guardбудет срабатывать при каждом обновленииsource - Если
sourceне передан,targetбудет вызван с данными изclock - Если
targetне передан, будет создано новое событие и возвращено в качестве результата - Если
filterэто стор, то его значение будет проверено на истинность - Если
filterэто функция-предикат, то она будет вызвана с данными изsourceиclock, а результат проверен на истинность
clock добавлен в effector 21.8.0
guard({clock?, source?, filter, target?})
Основная запись метода
Аргументы
params (Object): Объект конфигурации
-
filter: Стор или функция-предикатРазновидности:
- стор:
targetбудет запущен только если в этом сторе истинное значение - функция-предикат
(source, clock) => boolean:targetбудет запущен только если эта функция вернёт истинное значение. Функция должна быть чистой
- стор:
-
clock?: Юнит или массив юнитовРазновидности:
- событие или эффект: срабатывание этого события/эффекта, после проверки условия в
filterбудет запускатьtarget - стор: обновление этого стора, после проверки условия в
filterбудет запускатьtarget - массив юнитов: срабатывание любого из юнитов, после проверки условия в
filterбудет запускатьtarget. Сокращение для вызова merge - поле отсутствует:
sourceбудет использоваться в качествеclock
- событие или эффект: срабатывание этого события/эффекта, после проверки условия в
-
source?: Юнит или массив/объект со сторамиРазновидности:
- событие или эффект: при срабатывании
clockбудет взято последнее значение с которым запускался этот юнит (перед этим он должен будет запуститься хотя бы раз) - стор: при срабатывании
clockбудет взято текущее значение этого стора - массив или объект со сторами: при срабатывании
clockбудут взяты текущие значения из заданных сторов, объединенных в объект или массив. Сокращение для вызова combine - поле отсутствует:
clockбудет использоваться в качествеsource
- событие или эффект: при срабатывании
-
target?: Юнит или массив юнитовРазновидности:
- событие или эффект: при срабатывании
clock, после проверки условия вfilterбудет вызван данный юнит - стор: при срабатывании
clock, после проверки условия вfilterсостояние юнита будет обновлено - массив юнитов: при срабатывании
clock, после проверки условия вfilterбудут запущены все юниты - поле отсутствует: новое событие будет создано и возвращено в результате вызова
guard
- событие или эффект: при срабатывании
Возвращает
Event, событие, которое будет срабатывать после проверки условия в filter
Пример со стором в filter
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 requests = createStore(0).on(fetchRequest, (x) => x + 1);
const isIdle = fetchRequest.pending.map((pending) => !pending);
/*1. при срабатывании clickRequest2. если значение isIdle равно true3. прочитать значение из clicks4. и вызвать с ним эффект fetchRequest*/guard({ clock: clickRequest /* 1 */, filter: isIdle /* 2 */, source: clicks /* 3 */, target: fetchRequest /* 4 */,});Пример с функцией-предикатом в filter
import { createEffect, createEvent, guard } from "effector";
const searchUser = createEffect();const submitForm = createEvent();
guard({ source: submitForm, filter: (user) => user.length > 0, target: searchUser,});
submitForm(""); // ничего не произошлоsubmitForm("alice"); // ~> searchUser('alice')guard(source, {filter})
Альтернативная запись метода
Аргументы
-
source: Юнит -
filter: Стор или функция-предикатРазновидности:
- стор:
targetбудет запущен только если в этом сторе истинное значение - функция-предикат
(source) => boolean:targetбудет запущен только если эта функция вернёт истинное значение. Функция должна быть чистой
- стор:
Пример со стором в 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"); // ничего не произошлоunlock();trigger("C");Пример с функцией-предикатом в filter
import { createEvent, guard } from "effector";
const source = createEvent();const target = guard(source, { filter: (x) => x > 0,});
target.watch(() => { console.log("target вызван");});
source(0);// ничего не произошлоsource(1);// target вызванДокументация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.