开发者问题收集

Ramda Pipe 抛出 TypeError:无法读取未定义的“length”属性

2019-03-18
885

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

2个回答
() => pipe(createStage, buildStage);

是一个由单个操作组成的函数,使用指定的参数调用 pipe 并返回结果。因此, stageGenerator 是一个函数。如果没有 () =>stageGenerator 将是一个值,即 pipe 返回的值。 在此处阅读更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Lajos Arpad
2019-03-18

在这两个例子中,您实际上从未调用过 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);

但是不要忘记使用一些参数来调用它 ;)

customcommander
2019-03-19