如何在javascript中使用函数链接组合?
作者:互联网
我有这个代码正在建立一个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.chain(protocol(p)).chain(base(b)).chain(params(p)).chain(query(q)).build()
我该如何开始这样做?
更新:下面的解决方案非常好,但我想了解功能程序员如何使用Monads的ADT(代数数据类型)来解决这个问题.我们的想法是运行一系列功能然后折叠以获得我想要的价值
解决方法:
你在找这样的东西吗?
链接基本上发生在每个函数调用中返回完整对象时.这里每个函数都设置其给定块的值,并返回该对象以适应它所附加的任何上下文.每个函数都能够处理它接收的值,而value函数将根据设置的参数构建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"
标签:function-composition,javascript,functional-programming 来源: https://codeday.me/bug/20190828/1754476.html