import { scopeBind } from "effector";
scopeBind
— метод для привязки юнита (эвента или эффекта) к скоупу, который может быть вызван позже. Эффектор поддерживает императивный вызов эвентов внутри обработчиков, однако существуют случаи, когда необходимо явно привязать эвенты к скоупу — например, при вызове эвентов из колбэков setTimeout
или setInterval
.
Методы
scopeBind(event, options?)
Формула
scopeBind<T>(event: EventCallable<T>): (payload: T) => void
scopeBind<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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.