我有一个curried函数,我的pipe
延迟执行,直到参数传入。
以下实现抛出TypeError: Cannot read property of 'length' of undefined
:
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
。当我调用stage.log时我调用它的类型,它会说function
。
但是,当我将管道功能更改为:
export const stageGenerator =
pipe(
tap(x => console.log(x)),
createStage,
buildStage,
);
当打电话给TypeError: Cannot read property 'call' of undefined
时,它会抛出stageMapper
。
为什么我会收到这些错误?用JavaScript调用错误的函数,还是错误的管道实现?
() => pipe(createStage, buildStage);
是一个由单个操作组成的函数,使用指定的参数调用管道并返回结果。所以,stageGenerator
是一个功能。没有() =>
stageGenerator
将是一个值,由管道返回。在这里阅读更多: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);
不要忘记用一些参数调用它;)