import { createEffect, type Effect } from "effector";
Method for creating an effect.
Methods
createEffect(handler)
Creates an effect with the given handler.
Formulae
createEffect(handler?): Effect<Params, Done, Fail>
Arguments
handler
(Function): Function to handle effect calls, can also be set using.use(handler)
.
Returns
Effect: A new effect.
Reminder
You must provide a handler either in createEffect
or in .use
method later; otherwise, the effect will throw with the no handler used in _%effect name%_
error.
since
Examples
Create effect with handler
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" });
Change state on effect completion
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 repos
await fetchUserReposFx({ name: "zerobias" });
// => 26 repos
Set handler to effect after creating
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" });
Watch effect status
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); // resolved value
});
fetchUserReposFx.fail.watch(({ params, error }) => {
console.error(params); // {name: 'zerobias'}
console.error(error); // rejected value
});
fetchUserReposFx.finally.watch(({ params, status, result, error }) => {
console.log(params); // {name: 'zerobias'}
console.log(`handler status: ${status}`);
if (error) {
console.error("handler rejected", error);
} else {
console.log("handler resolved", result);
}
});
await fetchUserReposFx({ name: "zerobias" });
createEffect(config)
Creates an effect with handler and name from a given config object.
Formulae
createEffect({ handler, name }): Effect<Params, Done, Fail>
Arguments
config?: {}
(Object): Effect configuration.handler
(Function): Function to handle effect calls, can also be set using.use(handler)
.name?
(string): Optional effect name.
Returns
Effect: A new effect.
Examples
Create named 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" });