guard
C effector 22.2.0 предпочтительнее использовать sample
Добавлен в effector 20.4.0
Метод для запуска юнитов по условию, условием может быть функция-предикат или отдельный стор. Позволяет описывать бизнес-правила независимо от других сущностей.
Типичный вариант использования - когда необходимо запускать события лишь когда в определённом сторе значение равно true
. Тем самым обеспечивается управление потоками данных без их смешивания
Формула
guard({clock?, source?, filter, target?}): target
clock
или 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. при срабатывании clickRequest
2. если значение isIdle равно true
3. прочитать значение из clicks
4. и вызвать с ним эффект 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 вызван