javascript - 如何在 javascript 中使用功能链接和组合?

标签 javascript functional-programming function-composition

我有这段代码正在构建一个接受不同参数的 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/

相关文章:

javascript - 将 div 高度设置为等宽 ( javascript )

javascript - excel和javascript的结果公式不同

javascript - 为什么控制台加载的脚本无法访问 DOM?

javascript - 未捕获的类型错误 : Illegal invocation in JavaScript

c++ - 如何用 STL 实现替换这个 for 循环?

Haskell:用两个 float 参数组合函数失败

haskell - 具有反向语法的函数组合

javascript - 正则表达式字符串比较忽略符号

java - Java 中从 if-elseif-else 获取值的功能变体

javascript - 在 JavaScript 中将基类型的属性应用于子类型