В настоящее время я изучаю функциональное программирование на 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,
]);
Но я не могу понять, как вы будете использовать это с pipe
или compose
(конечно, асинхронно), потому что так, как я написал, вам нужно будет сделать:
postRequestWithAuth(ROUTE_HOUSES + uuid)(body)()
, тогда как последний вызов - просто для активации asyncPipe
.Как видите, это очень грязно и трудно pipe
.Как бы вы решили эту проблему функционально?