Ramda Pipe 抛出 TypeError:无法读取未定义的“length”属性
我有一个柯里化函数,其中我的
pipe
延迟执行,直到传入参数。
以下实现抛出
TypeError:无法读取未定义的“length”属性
:
export const stageGenerator =
pipe(
createStage,
buildStage,
);
//////// import stageGenerator in different file ///////////
const stageMapper = flowType => {
if (stage) return stageGenerator
const result = stageMapper('asdf')
但以下实现有效
export const stageGenerator = () =>
pipe(
createStage,
buildStage,
);
//////// import stageGenerator in different file ///////////
const stageMapper = flowType => {
if (stage) return stageGenerator()
const result = stageMapper('asdf')
最重要的是,像这样手动管道函数有效:
const stageGenerator = (params) => buildStage(createStage(params))
在这两种情况下,我都将相同的参数传递给
stageMapper
。当我在调用 stageMapper 时 console.log 其类型时,它会显示
function
。
但是,当我将管道函数更改为:
export const stageGenerator =
pipe(
tap(x => console.log(x)),
createStage,
buildStage,
);
调用
stageMapper
时,它将抛出
TypeError: Cannot read property 'call' of undefined
。
为什么我会收到这些错误?是 JavaScript 的错误函数调用,还是管道的错误实现?
() => pipe(createStage, buildStage);
是一个由单个操作组成的函数,使用指定的参数调用 pipe 并返回结果。因此,
stageGenerator
是一个函数。如果没有
() =>
,
stageGenerator
将是一个值,即 pipe 返回的值。
在此处阅读更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
在这两个例子中,您实际上从未调用过
stageGenerator
:
export const stageGenerator =
pipe(
createStage,
buildStage,
);
//////// import stageGenerator in different file ///////////
const stageMapper = flowType => {
if (stage) return stageGenerator
pipe
创建了一个函数,因此
stageGenerator
是一个您需要使用一些参数调用的函数:
const stageMapper = flowType => {
if (stage) return stageGenerator(stage);
//...
}
在第二个例子中,
stageGenerator
是一个返回另一个函数(来自
pipe
的结果)的函数
export const stageGenerator = () =>
pipe(
createStage,
buildStage,
);
//////// import stageGenerator in different file ///////////
const stageMapper = flowType => {
if (stage) return stageGenerator()
但这仍然是同一个问题:您仍然需要使用一些参数来调用它:
const stageMapper = flowType => {
if (stage) return stageGenerator()(stage);
//...
}
这可能不是您的本意:
const stageGenerator = () =>
pipe(createStage, buildStage);
这是一个返回另一个函数的函数。除非你传递一些参数来直接执行它,如下所示:
const stageGenerator = (params) =>
pipe(createStage, buildStage)
(params);
那么你也可以简化它并执行:
const stageGenerator = pipe(createStage, buildStage);
但是不要忘记使用一些参数来调用它 ;)