不理解这段函数式编程,看不懂

const TOKEN = '123'
const ROOT = '//www.baidu.com'

const root = createAPI => (...args) => {
  const result = createAPI(...args)
  return {...result, url: `${ROOT}${result.url}`}
}

const auth = createAPI => (...args) => {
  const result = createAPI(...args)
  return {
    ...result,
    headers: {...result.headers, authorization: `Bearer ${TOKEN}`},
  }
}

const projects = team => {
  return {
    url: `/api/0/teams/${team}/projects/`,
  }
}

root(auth(projects))('fe')
// 返回值如下
{
   headers: {authorization: "Bearer 123"}
   url: "//www.baidu.com/api/0/teams/fe/projects/"
}

不理解这段函数式编程,看不懂,谁能详细解释下?

### 你期待的结果是什么?实际看到的错误信息又是什么?
阅读 2.3k
3 个回答
  • 函数 root 接受一个函数 A 并返回一个函数 B ,函数 B 的函数体为:
  const result = createAPI(...args)
  return {...result, url: `${ROOT}${result.url}`}

因此,函数 root 的功能是,将传递给 B 的所有参数传递给 A 获得结果 result,在 result 的基础上增加一个 url 字段。

  • 函数 auth 的流程与 root 类似。
  • 函数 projects 的功能是根据传入参数构建一个 object,其含有一个 url 字段。

所以整理一下可得:

root(auth(projects))('fe') 中参数 fe 被一路传递到 projects 这个函数,三层函数展开后的顺序是:
projects('fe') | auth | root

  1. 先构造基础数据,拼接 url
    projects('fe') >>

    { 
        url: '/api/0/teams/fe/projects/'
    }
  2. 在第一步的基础上增加 headers.authorization 字段
    auth >>

    {
        headers: {
            // ...result.headers 是为了保留在 projects 函数中定义的 headers(如果有的话)
            authorization: 'Bearer 123'
        },
        url: '/api/0/teams/fe/projects/'
    }
  3. root 修正 url 的前缀
    root >>

    {
       headers: {authorization: "Bearer 123"}
       url: "//www.baidu.com/api/0/teams/fe/projects/"
    }
理解这个你需要弄明白 ... 操作符的意思,弄明白箭头函数的意思
可以把执行函数  root(auth(projects))('fe')  拆成两部分来看,都是一些嵌套函数,把函数作为参数共另一个函数调用。


auth(projects)   返回的是 
{
   headers: {authorization: "Bearer 123"}
}

root()('fe') 返回的是 
{
   url: "//www.baidu.com/api/0/teams/fe/projects/"
}

...操作符把两次返回的结果展开并组合为一个新的对象

`
const root = function(createAPI){

return function (...args){
    const result = createAPI(...args);
    return {
        ...result,
        url: `${ROOT}${result.url}`;
    }
}

}

`
root 接受一个函数A,返回另一个函数B,
函数B的返回结果是一个对象,其中组合了函数A的返回结果
auth 同理。

最终参数是传到projects然后将返回的对象进行组合

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题