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

Аргументы

  1. event EventCallable или Effect для привязки к скоупу.
  2. 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?)

Привязывает произвольный колбэк к скоупу, чтобы его можно было вызвать позже. Полученная привязанная версия функции сохраняет все свойства оригинала — например, если оригинальная функция выбрасывала ошибку при определённых аргументах, то привязанная версия также будет выбрасывать ошибку при тех же условиях.

since

Функциональность доступна, начиная с релиза effector 23.1.0. Поддержка нескольких аргументов функции появилась в effector 23.3.0.

warning

Чтобы быть совместимыми с Fork API, колбэки должны соблюдать те же правила, что и хендлеры эффектов:

  • Синхронные функции можно использовать как есть.
  • Асинхронные функции должны соответствовать правилам при работе с скоупом.

Формула

scopeBind(callback: (...args: Args) => T, options?: { scope?: Scope; safe?: boolean }): (...args: Args) => T;

Аргументы

  1. callback (Function): любая функция, которую нужно привязать к скоупу.
  2. 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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.

Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.

Соавторы