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

问题描述 投票:1回答:2

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

javascript ramda.js
2个回答
0
投票
() => pipe(createStage, buildStage);

是一个由单个操作组成的函数,使用指定的参数调用管道并返回结果。所以,stageGenerator是一个功能。没有() => stageGenerator将是一个值,由管道返回。在这里阅读更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions


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

不要忘记用一些参数调用它;)

© www.soinside.com 2019 - 2024. All rights reserved.