首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ramda管道引发TypeError:无法读取未定义的'length‘属性

Ramda管道引发TypeError:无法读取未定义的'length‘属性
EN

Stack Overflow用户
提问于 2019-03-19 05:24:48
回答 2查看 535关注 0票数 1

我有一个curried函数,在这个函数中,pipe会延迟执行,直到传入参数为止。

下面的实现抛出TypeError: Cannot read property of 'length' of undefined

代码语言:javascript
运行
复制
export const stageGenerator =
  pipe(
    createStage,
    buildStage,
  );

//////// import stageGenerator in different file ///////////

const stageMapper = flowType => {
  if (stage) return stageGenerator

const result = stageMapper('asdf')

但是下面的实现是可行的

代码语言:javascript
运行
复制
export const stageGenerator = () =>
  pipe(
    createStage,
    buildStage,
  );

//////// import stageGenerator in different file ///////////

const stageMapper = flowType => {
  if (stage) return stageGenerator()

const result = stageMapper('asdf')

最重要的是,通过管道手动传递函数,如下所示:

代码语言:javascript
运行
复制
const stageGenerator = (params) => buildStage(createStage(params))

在这两种情况下,我都将相同的参数传递给stageMapper。当我调用stageMapper的类型时,它会显示为function

但是,当我将管道函数更改为:

代码语言:javascript
运行
复制
export const stageGenerator =
  pipe(
    tap(x => console.log(x)),
    createStage,
    buildStage,
  );

在调用stageMapper时抛出TypeError: Cannot read property 'call' of undefined

为什么我会得到这些错误?这是JavaScript的错误函数调用,还是管道的错误实现?

EN

回答 2

Stack Overflow用户

发布于 2019-03-19 05:52:16

代码语言:javascript
运行
复制
() => pipe(createStage, buildStage);

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-19 13:16:34

在这两个示例中,您从未实际调用过stageGenerator

代码语言:javascript
运行
复制
export const stageGenerator =
  pipe(
    createStage,
    buildStage,
  );

//////// import stageGenerator in different file ///////////

const stageMapper = flowType => {
  if (stage) return stageGenerator

pipe创建了一个函数,因此stageGenerator是一个需要使用一些参数调用的函数:

代码语言:javascript
运行
复制
const stageMapper = flowType => {
  if (stage) return stageGenerator(stage);
  //...
}

在第二个示例中,stageGenerator是一个返回另一个函数(来自pipe的结果)的函数

代码语言:javascript
运行
复制
export const stageGenerator = () =>
  pipe(
    createStage,
    buildStage,
  );

//////// import stageGenerator in different file ///////////

const stageMapper = flowType => {
  if (stage) return stageGenerator()

但这仍然是同一个问题:您仍然需要使用一些参数来调用它:

代码语言:javascript
运行
复制
const stageMapper = flowType => {
  if (stage) return stageGenerator()(stage);
  //...
}

这可能不是你想说的:

代码语言:javascript
运行
复制
const stageGenerator = () =>
  pipe(createStage, buildStage);

这是一个返回另一个函数的函数。除非您向它传递一些参数来直接执行它,如下所示:

代码语言:javascript
运行
复制
const stageGenerator = (params) =>
  pipe(createStage, buildStage)
    (params);

那么你也可以简化它,这样做:

代码语言:javascript
运行
复制
const stageGenerator = pipe(createStage, buildStage);

别忘了用一些参数来调用它;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55230258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档