Effect
Effect (эффект) это контейнер для сайд-эффектов, возможно асинхронных. В комплекте имеет ряд заранее созданных эвентов и сторов, облегчающих стадартные действия. Является юнитом
Эффекты можно вызывать как обычные функции (императивный вызов) а также подключать их и их свойства в различные методы api включая sample, guard и split (декларативное подключение). При императивном вызове принимают максимум один аргумент и всегда возвращают промис, отражающий ход выполнения сайд-эффекта
#
СтруктураМетоды
- map: создает производное событие на основе данных эффекта
- prepend: создаёт событие-триггер для преобразования данных перед запуском эффекта
- watch: вызывает дополнительную функцию с сайд-эффектами при каждом срабатывании эффекта
- use: определяет имплементацию эффекта: функцию, которая будет вызвана при срабатывании
Свойства
- doneData: событие, которое срабатывает с результатом выполнения эффекта
- failData: событие, которое срабатывает с ошибкой, возникшей при выполнении эффекта
- pending: стор, который показывает, что эффект находится в процессе выполнения
- done: событие, которое срабатывает с результатом выполнения эффекта и аргументом, переданным при вызове
- fail: событие, которое срабатывает с ошибкой, возникшей при выполнении эффекта и аргументом, переданным при вызове
- finally: событие, которое срабатывает при завершении эффекта с подробной информацией об аргументах, результатах и статусе выполнения
- inFlight: стор, который показывает число запущенных эффектов, которые находятся в процессе выполнения
- shortName: имя эффекта
- sid: стабильный идентификатор эффекта
#
Примеры- map - пример использования map
- watch - пример использования watch
- use - пример использования use
- doneData - пример использования doneData
- failData - пример использования failData
- pending - отображение индикатора загрузки с react
- done - пример использования done
- fail - пример использования fail
- finally - пример использования finally
- inFlight - пример использования inFlight
#
Общий пример использования#
Методы#
mapСоздает производное событие на основе данных эффекта
#
ФормулаПри вызове fxA
, функция-обработчик fn
будет вызвана с поступившими данными, после чего производное событие eventB
будет вызвано с результатом вычислений
#
Аргументыfn
:(data: T) => S
Функция-обработчик, которая будет вычислять данные для передачи в производное событие
eventB
на основе данных изfxA
. Должна быть чистойАргументы
data
: Данные с которыми сработал эффектfxA
Возвращает
Данные для передачи в производное событие
eventB
#
ВозвращаетНовое, производное событие
#
Примеры#
Пример использования map#
prependСоздаёт событие-триггер для преобразования данных перед запуском эффекта. По сравнению с map, работает в обратном направлении
#
ФормулаПри вызове события trigger
, функция-обработчик fn
будет вызвана с поступившими данными, после чего fx
будет вызван с результатом вычислений
#
Аргументыfn
:(data: T) => S
Функция-обработчик, которая будет вычислять данные для передачи в
fx
на основе данных событияtrigger
. Должна быть чистойАргументы
data
: Данные с которыми сработало событиеtrigger
Возвращает
Данные для передачи в
fx
#
ВозвращаетНовое событие
#
watchВызывает дополнительную функцию с сайд-эффектами при каждом срабатывании эффекта
note
По мере усложнения логики проекта оптимальнее заменить на комбинацию дополнительного эффекта и сэмпла
#
Формула#
Аргументыwatcher
:(data: T) => any
Функция с сайд-эффектами, в качестве первого аргумента получает значение с которым был вызван эффект. Возвращаемое значение не используется
#
ВозвращаетSubscription: Функция отмены подписки, после её вызова watcher
перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего
#
Примеры#
Пример использования watch#
useОпределяет имплементацию эффекта: функцию, которая будет вызвана при срабатывании. Используется для случаев когда имплементация не установлена при создании или когда требуется изменение поведения эффекта при тестировании
Если на момент вызова эффект уже имел имплементацию, то она будет заменена на новую
статья от автора
note
Нужно предоставить имплементацию либо через use, либо через createEffect, иначе при вызове эффекта возникнет ошибка "no handler used in %effect name%"
#
Формула#
Аргументыhandler
:(params: T) => S | Promise<S>
Функция-имплементация эффекта. Может быть как синхронной, так и асинхронной
Аргументы
params
: Данные, с которыми был вызван эффект
Вовзращает
Результат выполнения эффекта в виде значения, либо в виде промиса со значением
#
ВозвращаетТекущий эффект
note
Если значение имплементации известно сразу, то оптимальнее использовать createEffect(handler)
createEffect().use(handler)
это антипаттерн, который ухудшает вывод типов
#
Примеры#
Пример использования use#
Свойства#
doneDataСобытие, которое срабатывает с результатом выполнения эффекта
#
ФормулаВызов вручную запрещён
Это свойство управляется самим эффектом
note
Добавлено в effector 20.12.0
#
Примеры#
Пример использования doneData#
failDataСобытие, которое срабатывает с ошибкой, возникшей при выполнении эффекта
#
ФормулаВызов вручную запрещён
Это свойство управляется самим эффектом
note
Добавлено в effector 20.12.0
#
Примеры#
Пример использования failData#
pendingСтор, который показывает, что эффект находится в процессе выполнения
#
ФормулаЭто свойство избавляет от необходимости писать подобный код:
Изменение значения вручную запрещено
Это свойство управляется самим эффектом
#
Примеры#
Отображение индикатора загрузки с react#
doneСобытие, которое срабатывает с результатом выполнения эффекта и аргументом, переданным при вызове
#
ФормулаВызов вручную запрещён
Это свойство управляется самим эффектом
#
Примеры#
Пример использования done#
failСобытие, которое срабатывает с ошибкой, возникшей при выполнении эффекта и аргументом, переданным при вызове
#
ФормулаВызов вручную запрещён
Это свойство управляется самим эффектом
#
Примеры#
Пример использования fail#
finallyСобытие, которое срабатывает при завершении эффекта с подробной информацией об аргументах, результатах и статусе выполнения
#
ФормулаВызов вручную запрещён
Это свойство управляется самим эффектом
note
Добавлено в effector 20.0.0
#
Примеры#
Пример использования finally#
inFlightСтор, который показывает число запущенных эффектов, которые находятся в процессе выполнения. Используется для ограничения числа одновременных запросов
#
ФормулаЭто свойство избавляет от необходимости писать подобный код:
Изменение значения вручную запрещено
Это свойство управляется самим эффектом
note
Добавлено в effector 20.11.0
#
Примеры#
Пример использования inFlight#
shortNameИмя эффекта. Задаётся либо явно, через поле name
в createEffect, либо автоматически через babel plugin. Используется для обработки сущностей программно, например при использовании хуков домена
#
Формула#
sidСтабильный идентификатор эффекта. Задаётся автоматически через babel-plugin
#
Формула#
Дополнительные методы#
use.getCurrentМетод для получения текущей имплементации эффекта. Используется для тестирования
Если у эффекта ещё не была установлена имплементация, то будет возвращена функция по умолчанию, при срабатывании она выбрасывает ошибку
#
Формула#
ВозвращаетФункцию-имплементацию эффекта, которая была установлена через createEffect или с помощью метода use