首页 > 解决方案 > Ramda Pipe 抛出 TypeError: Cannot read property of 'length' undefined

问题描述

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

标签: javascriptramda.js

解决方案


() => pipe(createStage, buildStage);

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


推荐阅读