副作用
将输入步骤(或步骤数组,或无)作为第一个参数,回调作为第二个参数,并返回一个步骤,该步骤表示将每个值(或值数组,或无)通过给定回调后的结果。
回调预计会产生副作用(更改后端的数据或状态),如果您的回调没有任何副作用,请考虑使用 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());
无依赖版本
如果您的回调不需要任何输入,则可以传递 null
或 undefined
而不是步骤。
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),
);