跳至主要内容

副作用

将输入步骤(或步骤数组,或无)作为第一个参数,回调作为第二个参数,并返回一个步骤,该步骤表示将每个值(或值数组,或无)通过给定回调后的结果。

回调预计会产生副作用(更改后端的数据或状态),如果您的回调没有任何副作用,请考虑使用 lambda,它具有非常相似的 API。

信息

根据 GraphQL 规范,副作用只应出现在 GraphQL 变异操作的根选择集中(即变异操作根类型的字段上),类似地,Grafast 只期望在此处出现副作用,计划中其他位置的副作用可能会产生意想不到的后果。

sideEffect 不执行批处理;它只用于执行变异,而变异很少进行批处理。

提示

通过设置 $step.hasSideEffects = true,几乎任何步骤都可以被视为具有副作用,因此,如果您在变异中需要批处理,请考虑使用其他步骤,例如 loadOne() 并明确将其标记为具有副作用。

const $random = loadOne(list([$min, $max]), (tuples) =>
tuples.map(([min, max]) => min + Math.floor(Math.random() * (max - min + 1))),
);
$random.hasSideEffects = true;

return $random;

单依赖版本

function sideEffect<T, R>(
$input: ExecutableStep<T>,
callback: (input: T) => R | Promise<R>,
): ExecutableStep<R>;

示例

const $logout = context().get("logout");
sideEffect($logout, (logout) => logout());

无依赖版本

如果您的回调不需要任何输入,则可以传递 nullundefined 而不是步骤。

function sideEffect<R>(
$input: null | undefined,
callback: () => R | Promise<R>,
): ExecutableStep<R>;

示例

sideEffect(null, () => console.log(new Date().toISOString()));

多依赖版本

如果您需要传递多个步骤,可以使用 list() 步骤来执行此操作:sideEffect(list([$a, $b, $c]), ([a, b, c]) => doSomethingWith(a, b, c))

如果您想节省一些字符,可以直接传递步骤数组,我们会自动将其包装在 list() 中。

function sideEffect<Tuple extends [...any[]], R>(
// i.e. $input: ExecutableStep[],
$input: { [Index in keyof Tuple]: ExecutableStep<Tuple[Index]> },
callback: (input: Tuple) => R | Promise<R>,
): ExecutableStep<R>;

示例

sideEffect([$login, $username, $password], ([login, username, password]) =>
login(username, password),
);