Зависимые запросы
Когда одному запросу нужен результат другого (получить персонажа, затем его локацию), connectQuery связывает их: при успехе источника он вычисляет параметры цели и стартует её. Без sample-обвязки и без эффекта в компоненте.
Один источник
import { createQuery, connectQuery } from 'effector-refetch';
const characterQuery = createQuery({ effect: fetchCharacterFx, cache: true });
const originQuery = createQuery({ effect: fetchLocationFx, cache: { staleAfter: 60_000 } });
connectQuery({
source: characterQuery,
fn: ({ result: character }) => ({ params: { url: character.origin.url } }),
target: originQuery,
});
characterQuery.start(1); // originQuery стартует сам, когда персонаж загрузилсяfn получает { result, params } источника (результат и параметры, с которыми он отработал) и возвращает { params } для цели. Он пересчитывается на каждый успех источника, поэтому цель остаётся в синхроне — и, поскольку обе — обычные запросы, cache / retry / concurrency применяются к каждой независимо.
Несколько источников
Передайте объект запросов — цель стартует, когда все в статусе done, и затем снова при любом свежем результате любого из них:
connectQuery({
source: { user: userQuery, settings: settingsQuery },
fn: ({ user, settings }) => ({ params: { id: user.result.id, theme: settings.result.theme } }),
target: dashboardQuery,
});Каждый ключ в аргументе fn — это { result, params } соответствующего источника.
Гейт через filter
filter пропускает запуск цели, когда результат источника ещё не годится (та же форма { result, params }, верните false чтобы пропустить):
connectQuery({
source: characterQuery,
filter: ({ result: character }) => character.origin.url !== '', // неизвестная локация -> не грузим
fn: ({ result: character }) => ({ params: { url: character.origin.url } }),
target: originQuery,
});connectQuery vs combineQueries
connectQuery— цепочка: источник кормит параметры следующего запроса (запрос B зависит от результата A).combineQueries— агрегация: читать несколько независимых запросов как один общий$data/$pending/$errors(effector-вариантuseQueries), без зависимости между ними.
Рабочий пример: examples/rick-and-morty.ts.