gpt4 book ai didi

JavaScript 函数式编程 : How to handle fetch (for pipes)

转载 作者:行者123 更新时间:2023-12-01 15:44:06 24 4
gpt4 key购买 nike

我目前正在学习 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 是静态的,我可以 curry 这个函数并在这样的管道中使用它:
export const login = asyncPipe([
postRequest(ROUTE_LOGIN),
prop('token'),
setToken,
]); // Will get called with the correct body

到目前为止,一切都很好。但是现在我必须使用动态 URL 和正文发出请求,并且需要对其进行身份验证,因此我需要 header 。我正在努力编写这段代码,以便它是可管道的。

这是我尝试过的:
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,
]);

但我不知道你将如何将它与 pipe 一起使用或 compose (当然是异步的)因为我写它的方式你必须这样做:
postRequestWithAuth(ROUTE_HOUSES + uuid)(body)()而最后一次调用只是激活 asyncPipe .如您所见,这非常困惑且难以 pipe .您将如何以实用的方式解决此问题?

最佳答案

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

import { pipe, fork, get } from 'rubico'

// expects the object { body: {...}, uuid: 'string' }
export const postRequestWithAuth = route => pipe([
fork({
method: () => 'POST',
headers: pipe([
get('uuid'),
getToken,
token => ({
Authorization: `Token ${token}`,
'Content-Type': 'application/json',
}),
]),
body: pipe([
get('body'),
JSON.stringify,
]),
}),
payload => fetch(route, payload),
getJSON,
])

postRequestWithAuth('/myRoute')({
uuid: 'ffda7b1c-fc6b-4949-98c4-e5cb86675f5f',
body: { hello: 'world' },
})

我创建了 rubico表达像你这样的复杂异步情况。

关于JavaScript 函数式编程 : How to handle fetch (for pipes),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com