我到底如何以及在哪里传入参数参数和查询参数?
老实说,当你构建一个compose
or pipe
与 Ramda 或类似库的管道。
Ramda(免责声明:我是作者之一)允许第一个函数接收多个参数——其他一些库可以,有些则不能——但后续函数只会接收先前调用的结果。里面有一个函数避难所, meld,这可能对此有所帮助,但它确实有一个相当复杂的 API。
但是,我真的不明白为什么你首先要以这种方式构建这个函数。这些中间函数实际上是可重用的,还是您是根据规范构建它们的?我问的原因是,这似乎是同一想法的更明智的版本:
const finalEndpoint = useWith(
(endpoint, params, query) =>`https://${endpoint}?${params}&query=${query}`, [
endpoint => endpoint || 'default',
pipe(toPairs, map(join('=')), join('&')),
pipe(JSON.stringify, encodeURIComponent)
]
);
finalEndpoint(
'api.content.io',
{sort: 'desc', part: true},
{some:'value', another:'value'}
);
//=> "https://api.content.io?sort=desc&part=true&query=%7B%22some%22%3A%22value%22%2C%22another%22%3A%22value%22%7D"
我真的不知道你对最后一个参数的要求。如果没有那个,我看起来很奇怪encodeUriComponent
,但也许你不需要它。我还随意使用了第二个参数,假设您更喜欢 API 中的实际数据而不是封装该数据的字符串。但如果你want通过'sort=desc&part=true'
,然后替换pipe(toPairs, map(join('=')), join('&'))
with identity
.
由于整个事情远非无积分,所以我没有使用第一个函数的无积分版本,也许or(__, 'default')
,因为我认为那里的内容更具可读性。
Update
您可以在拉姆达 REPL,添加一些console.log
声明与tap.
这确实给 Ramda 提出了一个有趣的问题。如果确实需要这些中间功能,Ramda 无法提供将它们组合起来的方法。显然 Ramda 可以提供类似的东西meld
,但是有中间立场吗?我想知道是否有一个有用的函数(当然是柯里化的)我们应该包含它,它的作用类似于
someFunc([f0], [a0]); //=> f0(a0)
someFunc([f0, f1], [a0, a1]); //=> f1(f0(a0), a1)
someFunc([f0, f1, f2], [a0, a1, a2]); //=> f2(f1(f0(a0), a1), a2)
someFunc([f0, f1, f2, f3], [a0, a1, a2, a3]); //=> f3(f2(f1(f0(a0), a1), a2), a3)
// ...
有一些严重的反对意见:如果列表的长度不同怎么办?为什么初始调用是一元的,我们应该通过向函数添加单独的累加器参数来解决这个问题吗?尽管如此,这是一个有趣的功能,我可能会在 Ramda 板上提出它进行讨论。