创建参数类型的变量

时间:2019-04-03 16:54:32

标签: javascript

我正在尝试使中间件功能使其调试,该功能应带有一些参数,记录它们并传递给下一个功能:

const debug = (...args) => {
 console.log(...args)
 return args // will return array, not argument type variable
}

const compose = (...fns) => (...arg) => (
  fns.slice().reverse().reduce(
    (acc, fn) => !acc ? fn(...arg) : fn(acc), null
  )
)

const f = x => x * x

const g = (a, b) => a + b

const makeMagic = compose(
  f,
  g,
  debug
)

makeMagic(1, 2)

如果我从组合中删除调试,那么一切都会按预期工作,一旦将其放置在末尾,它就会中断。因为它接受参数但返回数组。

我试图用这种方式重写debug

function debug() {
  console.info(arguments)
  return arguments
}

但绝不会失败。

1 个答案:

答案 0 :(得分:2)

一个功能始终仅有一个结果值。您不能编写一个没有多个容器(例如数组)的接受多个参数并“返回”多个值的函数,而这只是JavaScript所没有的功能(大多数其他编程语言也没有)。

您可以将debug用作单个参数的纯传递,但不能多个。因此,例如,您可以完成这项工作:

const result = debug(makeMagic(1, 2))

......,其中result是返回的值makeMagic(在debug记录之后),但是您不能以这种方式将其包括在组合的makeMagic中您正在尝试。

要将debug(或任何其他函数)与compose放在链的中间,则必须使用约定以及所有compose可用的函数它们如何返回多个值,可能是通过使它们全部返回一个数组来实现的。这也有助于解决目前的问题,您的compose函数存在一个我认为是错误的错误:每当以前的函数返回 falsy 值({ {1}},...args0""NaNnull),我很确定您只打算在第一次通话。

这里是undefined的一个版本,该版本需要可组合的函数,这些函数会返回其结果数组:

false