lambda
将输入步骤(或步骤数组,或无)作为第一个参数,回调作为第二个参数,并返回一个步骤,该步骤代表将每个值(或值数组,或无)通过给定回调后的结果。
回调应该执行计算,或者可以获取数据,但不能有副作用。如果您需要执行有副作用的操作,请改用 sideEffect()
(它具有非常相似的 API)。
如果您 100% 确定您的回调函数
- 不执行任何异步工作(没有 promise),
- 没有副作用,
- 不会抛出错误
然后为了获得最佳性能,您可以将第三个参数 isSyncAndSafe
设为 true
。除非您确定,否则不要这样做!
单依赖版本
function lambda<T, R>(
$input: ExecutableStep<T>,
callback: (input: T) => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;
示例
// Takes a step representing a zero-based index, and converts it to a one-based
// index by adding one to it.
const $oneBased = lambda($zeroBased, (zeroBased) => zeroBased + 1, true);
无依赖版本
如果您的回调不需要任何输入,您可以传递 null
或 undefined
而不是步骤。
function lambda<R>(
$input: null | undefined,
callback: () => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;
多依赖版本
如果您需要传递多个步骤,可以使用 list()
步骤来执行此操作:lambda(list([$a, $b, $c]), ([a, b, c]) => a + b + c)
。
如果您希望节省一些字符,可以直接传递步骤数组,我们会自动将其包装在 list()
中。
function lambda<Tuple extends [...any[]], R>(
// i.e. $input: ExecutableStep[],
$input: { [Index in keyof Tuple]: ExecutableStep<Tuple[Index]> },
callback: (input: Tuple) => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;
示例
// Passing an array of steps gives you the values as an array:
const $aPlusB = lambda([$a, $b], ([a, b]) => a + b, true);
警告:没有批处理!
lambda
是一个逃生舱口,它使您摆脱 Grafast 的批处理;您应该只将其用于最简单的操作(即同步 JS 代码,不执行繁重的计算,并且不会从批处理中受益)。
在大多数情况下,您应该使用 loadOne
。以下是上面示例使用 loadOne
的样子 - 请注意,这些回调现在一次性调用所有值,而不是一次调用一个值。
const $oneBasedIndex = loadOne($zeroBasedIndex, (allN) =>
allN.map((n) => n + 1),
);
const $aPlusB = loadOne(list([$a, $b]), (allAsAndBs) =>
allAsAndBs.map(([a, b]) => a + b),
);