我有这段代码正在构建一个接受不同参数的 url 端点:
const query = (obj) => {
let starter = 'query='
let queryToString = JSON.stringify(obj)
return `${starter}${queryToString}`
}
const params = (str) => `${str}`
const endpoint = (protocol, base, params, query) => {
if (!params && !query) return `${base}`
if (!params) return `${base}${query}`
return `${protocol}${base}?${params}&${query}`
}
const baseUrl = 'api.content.io'
const protocol = (secure = true) => secure ? 'https://' : 'http://'
let result = endpoint(protocol(), baseUrl, params('limit=5&order=desc'),
query({
field: 'title',
include: 'brands'
}));
console.log(result)
这构建了一个像这样的字符串:
https: //api.content.io?limit=5&order=desc&query={"field":"title","include":"brands"}
是否可以重构此代码,以便可以删除 endpoint
函数中的条件,应用正确的连接字符串并将整个事情链接到一个函数中像这样打电话
Endpoint.chain(protocol(p)).chain(base(b)).chain(params(p)).chain(query(q)).build()
我如何开始这样做?
更新:下面的解决方案非常好,但我想了解函数式程序员如何使用 ADT(代数数据类型)和 Monad 来解决这个问题。这个想法是运行一个 chain
函数然后一个 fold
来取回我想要的值
最佳答案
您正在寻找这样的东西吗?
当您在每个函数调用中返回完整的对象时,基本上就会发生链接。这里每个函数都设置其给定 block 的值,并为它所附加的任何上下文返回 this 对象。每个函数都能够处理它接收到的值,值函数将根据设置的参数构建 url。
var Endpoint = {
protocol: protocol,
base: base,
params: params,
query: query,
value: value
}
function protocol(b) {
protocol.value = b && 'https://' || 'http://';
return this;
}
function base(s) {
base.value = s || '';
return this;
}
function params(s) {
params.value = s || '';
return this;
}
function query(s) {
query.value = s || '';
return this;
}
function value(s) {
return '$protocol$base$params$params$query'
.replace('$protocol',protocol.value)
.replace('$base',base.value)
.replace('$params',params.value)
.replace('$query',query.value)
}
Endpoint
.protocol(true)
.base('www.foo.com')
.params('one/two/three')
.query('?foo=bar')
.value()
// "https://www.foo.comone/two/three$params?foo=bar"
关于javascript - 如何在 javascript 中使用功能链接和组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393013/