编程语言
首页 > 编程语言> > 如何在javascript中使用函数链接组合?

如何在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