我有一个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
。当我在调用console.log时选择stageMapper的类型时,它将显示为function
。
但是,当我将管道功能更改为:
export const stageGenerator =
pipe(
tap(x => console.log(x)),
createStage,
buildStage,
);
在调用TypeError: Cannot read property 'call' of undefined
时它将抛出stageMapper
。
为什么会出现这些错误?这是JavaScript的错误函数调用,还是管道的错误实现?
答案 0 :(得分:0)
public void animateFAB(FABStates state) {
if (state.equals(FABStates.show)) {
isFABOpen = true;
initialHeight = mapUtilsContainer.getLayoutParams().height;
ValueAnimator va = ValueAnimator.ofInt(initialHeight, 0);
...
} else {
isFABOpen = false;
ValueAnimator va = ValueAnimator.ofInt(0, initialHeight);
...
}
}
是一个由单个操作组成的函数,它使用指定的参数调用管道并返回结果。因此,() => pipe(createStage, buildStage);
是一个函数。如果没有stageGenerator
() =>
将是一个值,该值由管道返回。
在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
答案 1 :(得分:0)
在两个示例中,您从未真正呼叫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);
尽管不要忘记使用一些参数来调用它;)