Ramda Pipe引发TypeError:无法读取'length'的属性未定义

时间:2019-03-18 21:24:48

标签: javascript ramda.js

我有一个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的错误函数调用,还是管道的错误实现?

2 个答案:

答案 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);

尽管不要忘记使用一些参数来调用它;)