import { scopeBind } from "effector";
scopeBind
— метод для привязки юнита (эвента или эффекта) к скоупу, который может быть вызван позже. Эффектор поддерживает императивный вызов эвентов внутри обработчиков, однако существуют случаи, когда необходимо явно привязать эвенты к скоупу — например, при вызове эвентов из колбэков setTimeout
или setInterval
.
Методы
scopeBind(event, options?)
Формула
scopeBind<T>(event: EventCallable<T>): (payload: T) => voidscopeBind<T>(event: EventCallable<T>, options?: {scope?: Scope, safe?: boolean}): (payload: T) => void
Аргументы
event
EventCallable или Effect для привязки к скоупу.options
(Object): опциональные настройкиscope
(Scope): скоуп, к которому нужно привязать эвентsafe
(Boolean): флаг для подавления исключений, если скоуп отсутствует
Возвращает
(payload: T) => void
— функция с теми же типами, что и у event
.
Примеры
Базовый пример
Мы собираемся вызвать changeLocation
внутри колбэка history.listen
, поэтому нет способа для эффектора ассоциировать эвент с соответствующим скоупом. Нам нужно явно привязать эвент к скоупу, используя scopeBind
.
import { createStore, createEvent, attach, scopeBind } from "effector";
const $history = createStore(history);const initHistory = createEvent();const changeLocation = createEvent<string>();
const installHistoryFx = attach({ source: $history, effect: (history) => { const locationUpdate = scopeBind(changeLocation);
history.listen((location) => { locationUpdate(location); }); },});
sample({ clock: initHistory, target: installHistoryFx,});
scopeBind(callback, options?)
Привязывает произвольный колбэк к скоупу, чтобы его можно было вызвать позже. Полученная привязанная версия функции сохраняет все свойства оригинала — например, если оригинальная функция выбрасывала ошибку при определённых аргументах, то привязанная версия также будет выбрасывать ошибку при тех же условиях.
Функциональность доступна, начиная с релиза effector 23.1.0
.
Поддержка нескольких аргументов функции появилась в effector 23.3.0
.
Чтобы быть совместимыми с Fork API, колбэки должны соблюдать те же правила, что и хендлеры эффектов:
- Синхронные функции можно использовать как есть.
- Асинхронные функции должны соответствовать правилам при работе с скоупом.
Формула
scopeBind(callback: (...args: Args) => T, options?: { scope?: Scope; safe?: boolean }): (...args: Args) => T;
Аргументы
callback
(Function): любая функция, которую нужно привязать к скоупу.options
(Object): необязательные настройки.scope
(Scope): скоуп, к которому нужно привязать эвент.safe
(Boolean): флаг для подавления исключений, если скоуп отсутствует.
Возвращает
(...args: Args) => T
— функция с теми же типами, что и у callback
.
Примеры
import { createEvent, createStore, attach, scopeBind } from "effector";
const $history = createStore(history);const locationChanged = createEvent();
const listenToHistoryFx = attach({ source: $history, effect: (history) => { return history.listen( scopeBind((location) => { locationChanged(location); }), ); },});
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.