我正在尝试使中间件功能使其调试,该功能应带有一些参数,记录它们并传递给下一个功能:
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
}
但绝不会失败。
答案 0 :(得分:2)
一个功能始终仅有一个结果值。您不能编写一个没有多个容器(例如数组)的接受多个参数并“返回”多个值的函数,而这只是JavaScript所没有的功能(大多数其他编程语言也没有)。
您可以将debug
用作单个参数的纯传递,但不能多个。因此,例如,您可以完成这项工作:
const result = debug(makeMagic(1, 2))
......,其中result
是返回的值makeMagic
(在debug
记录之后),但是您不能以这种方式将其包括在组合的makeMagic
中您正在尝试。
要将debug
(或任何其他函数)与compose
放在链的中间,则必须使用约定以及所有compose
可用的函数它们如何返回多个值,可能是通过使它们全部返回一个数组来实现的。这也有助于解决目前的问题,您的compose
函数存在一个我认为是错误的错误:每当以前的函数返回 falsy 值({ {1}},...args
,0
,""
,NaN
或null
),我很确定您只打算在第一次通话。
这里是undefined
的一个版本,该版本需要可组合的函数,这些函数会返回其结果数组:
false