JavaScript函数式编程:如何处理获取(对于管道)

JavaScript函数式编程:如何处理获取(对于管道),javascript,functional-programming,fetch-api,currying,ramda.js,Javascript,Functional Programming,Fetch Api,Currying,Ramda.js,我目前正在学习JavaScript中的函数式编程。我使用ramda作为帮助程序库来编写帮助程序,例如asyncPipe: import { pipeWith, then } from 'ramda'; export const asyncPipe = pipeWith(then); 要让用户登录,我必须使用静态url发出未经验证的获取请求: export const postRequest = route => asyncPipe([ body =>

我目前正在学习JavaScript中的函数式编程。我使用ramda作为帮助程序库来编写帮助程序,例如
asyncPipe

import { pipeWith, then } from 'ramda';

export const asyncPipe = pipeWith(then);
要让用户登录,我必须使用静态url发出未经验证的获取请求:

export const postRequest = route =>
  asyncPipe([
    body =>
        fetch(route, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(body),
        }),
    getJSON,
]);
现在,由于url是静态的,我可以使用此函数并在如下管道中使用它:

export const login = asyncPipe([
    postRequest(ROUTE_LOGIN),
    prop('token'),
    setToken,
]); // Will get called with the correct body
到目前为止还不错。但现在我必须使用动态URL和主体发出请求,并且需要对其进行身份验证,所以我需要标题。我正在努力编写这段代码,以便它可以通过管道传输

以下是我尝试过的:

export const postRequestWithAuth = route => body =>
  asyncPipe([
    getToken,
    token =>
        fetch(route, {
            method: 'POST',
            headers: { Authorization: `Token ${token}`, 'Content-Type': 'application/json' },
            body: JSON.stringify(body),
        }),
    getJSON,
]);
但我不知道如何将其用于
管道
编写
(当然是异步的),因为我编写它的方式必须:


postRequestWithAuth(ROUTE_house+uuid)(body)(
),而最后一个调用只是为了激活
异步管道。如您所见,这非常混乱,很难
管道
。如何用函数的方式解决这个问题?

这里有一种编写所需代码的方法,尽管它不是ramda

从'rubico'导入{pipe,fork,get}
//需要对象{body:{…},uuid:'string'}
export const postRequestWithAuth=route=>pipe([
叉子({
方法:()=>“POST”,
集管:管道([
获取('uuid'),
格托克,
令牌=>({
授权:`Token${Token}`,
“内容类型”:“应用程序/json”,
}),
]),
主体:管道([
获取('body'),
JSON.stringify,
]),
}),
有效负载=>fetch(路由、有效负载),
getJSON,
])
postRequestWithAuth(“/myRoute”)({
uuid:'ffda7b1c-fc6b-4949-98c4-e5cb86675f5f',
正文:{你好:'世界'},
})

我创建它是为了表达像您这样复杂的异步情况。

pipe
/
compose
不使用具有多个参数或无参数的函数。只是不要在这里使用它们。请注意,执行IO(
getToken
fetch
)无论如何都不是很有效。@Bergi谢谢,您可以发布这些类型吗?此外,完整地查看代码会很有帮助。@AaditMShah类型是什么意思?我使用纯JavaScript。是的,但即使你使用纯JavaScript,你也必须考虑你头脑中的类型。为什么要删除所有解释,以及披露
rubico
是你自己的库?rubico不再是我自己的库将其移动到一个组织是一个好主意,但为什么要删除链接而不是更新它?另外,你已经开始了图书馆的建设,到目前为止,你仍然是唯一的贡献者,你应该获得这一荣誉。好吧,既然你这么说了,我就编辑这篇文章来添加新的链接!我还做了一些解释,因为我觉得我听起来有些畏缩