【发布时间】:2019-07-18 00:53:29
【问题描述】:
我目前正在学习 JavaScript 中的函数式编程。我用 ramda 作为 helper 库来写 helper 比如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 和正文发出请求,并且需要对其进行身份验证,因此我需要标头。我正在努力编写这段代码,以便它是可管道的。
这是我尝试过的:
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 非常混乱且难以处理。您将如何以实用的方式解决这个问题?
【问题讨论】:
-
pipe/compose不适用于带有多个参数或不带参数的函数。只是不要在这里使用它们。请注意,做 IO(getToken,fetch)无论如何都不是很实用。 -
@Bergi 谢谢????
-
你能发布类型吗?此外,完整地查看您的代码会很有帮助。
-
@AaditMShah 类型是什么意思?我使用纯 JavaScript。
-
是的,但是即使您使用纯 JavaScript,您也必须在脑海中考虑类型。
标签: javascript functional-programming fetch-api currying ramda.js