Метод для создания эффектов.
createEffect с обработчиком событий
Формула
createEffect(handler?)
Аргументы
handler
(Function): Функция для обработки вызовов эффектов, также может быть задана с помощью use(handler)
Возвращает
Effect: Новый эффект
info
Вы должны задать обработчик в createEffect или же в .use методе позже, иначе эффект выбросит исключение “no handler used in %effect name%”
since
Примеры
Создание эффекта с обработчиком событий
import { createEffect } from "effector";
const fetchUserReposFx = createEffect(async ({ name }) => {
const url = `https://api.github.com/users/${name}/repos`;
const req = await fetch(url);
return req.json();
});
fetchUserReposFx.done.watch(({ params, result }) => {
console.log(result);
});
await fetchUserReposFx({ name: "zerobias" });
Изменение состояния по завершению эффекта
import { createStore, createEffect } from "effector";
const fetchUserReposFx = createEffect(async ({ name }) => {
const url = `https://api.github.com/users/${name}/repos`;
const req = await fetch(url);
return req.json();
});
const $repos = createStore([]).on(fetchUserReposFx.doneData, (_, repos) => repos);
$repos.watch((repos) => {
console.log(`${repos.length} repos`);
});
// => 0 репозиториев
await fetchUserReposFx({ name: "zerobias" });
// => 26 репозиториев
Назначение обработчика для эффекта после его создания
import { createEffect } from "effector";
const fetchUserReposFx = createEffect();
fetchUserReposFx.use(async ({ name }) => {
const url = `https://api.github.com/users/${name}/repos`;
const req = await fetch(url);
return req.json();
});
await fetchUserReposFx({ name: "zerobias" });
Наблюдение за состоянием эффекта
import { createEffect } from "effector";
const fetchUserReposFx = createEffect(async ({ name }) => {
const url = `https://api.github.com/users/${name}/repos`;
const req = await fetch(url);
return req.json();
});
fetchUserReposFx.pending.watch((pending) => {
console.log(`effect is pending?: ${pending ? "yes" : "no"}`);
});
fetchUserReposFx.done.watch(({ params, result }) => {
console.log(params); // {name: 'zerobias'}
console.log(result); // разрешенное значение, результат
});
fetchUserReposFx.fail.watch(({ params, error }) => {
console.error(params); // {name: 'zerobias'}
console.error(error); // отклоненное значение, ошибка
});
fetchUserReposFx.finally.watch(({ params, status, result, error }) => {
console.log(params); // {name: 'zerobias'}
console.log(`handler status: ${status}`);
if (error) {
console.log("handler rejected", error);
} else {
console.log("handler resolved", result);
}
});
await fetchUserReposFx({ name: "zerobias" });
createEffect с параметрами
Создает эффект с обработчиком событий и именем, которые заданы в объекте параметров
Формула
createEffect({ handler, name });
Аргументы
config
? (Params): Эффектhandler
(Function): Функция для обработки вызовов эффектов, также может быть назначена с use(handler)name
? (string): Необязательное имя эффекта
Возвращает
Effect: Новый эффект
Примеры
Создание эффекта с заданным именем
import { createEffect } from "effector";
const fetchUserReposFx = createEffect({
name: "fetch user repositories",
async handler({ name }) {
const url = `https://api.github.com/users/${name}/repos`;
const req = await fetch(url);
return req.json();
},
});
await fetchUserReposFx({ name: "zerobias" });
Перевод поддерживается сообществом
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.