我正在尝试让中间件函数调用它调试,它应该接受一些参数,记录它们并传递给下一个函数:
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
}
但绝不会失败。
最佳答案
一个函数总是只有一个结果值。你不能编写一个接受多个参数并“返回”多个值的函数,而没有围绕它们的某种容器(如数组),这不是 JavaScript 所具有的功能(大多数其他编程语言也不具备)。
您可以使debug
成为单个 参数的纯传递,但不能是多个参数。因此,例如,您可以使这项工作:
const result = debug(makeMagic(1, 2))
...其中 result
将是 makeMagic
返回的值(在 debug
记录它之后),但您不能将其包含在按照您尝试的方式组合 makeMagic
。
要在 compose
链的中间使用 debug
(或任何其他函数),您必须对它和所有 使用约定>compose
关于它们如何返回多个值的函数,可能是通过让它们都返回一个数组。这也有助于说明现在的事实,你的 compose
函数有一个我认为是错误的东西:它使用 ...args
任何时候前一个函数返回一个 falsy 值 (0
, ""
, NaN
, null
, undefined
,或 false
),我很确定您只打算在第一次调用时这样做。
这是 compose
的一个版本,它需要可组合函数,这些函数返回其结果的数组:
const debug = (...args) => {
console.log(...args);
return args;
};
const compose = (...fns) => (...args) => (
fns.slice().reverse().reduce(
(acc, fn) => fn(...(acc || args)),
null
)
);
const f = x => [x * x];
const g = (a, b) => [a + b];
const makeMagic = compose(
f,
g,
debug
);
const result = makeMagic(1, 2);
console.log(result);
关于javascript - 创建参数类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500420/