В настоящее время я изучаю функциональное программирование на 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. Как бы вы решили это функциональным способом?
@Берги Спасибо ?
Не могли бы вы написать типы? Кроме того, было бы полезно увидеть ваш код целиком.
@AaditMShah Что вы имеете в виду под типами? Я использую чистый JavaScript.
Да, но даже если вы используете чистый JavaScript, вы должны думать о типах в своей голове.
Итак, route — это строка, body — объект, token — строка.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот способ написать желаемый код, хотя это и не 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 — это ваша собственная библиотека?
rubico больше не моя собственная библиотека
Переместить его в организацию — хорошая идея, но зачем удалять ссылку, а не обновлять ее? Кроме того, вы запустили библиотеку и до сих пор являетесь единственным участником, вы должны взять на себя ответственность.
хорошо, теперь, когда вы так выразились, я отредактирую пост, чтобы поставить новую ссылку! также я достал некоторые объяснения, потому что я думал, что звучал съеживаясь
pipe/composeне работают с функциями, которые принимают несколько аргументов или не имеют аргументов. Только не используйте их здесь. Обратите внимание, что выполнение ввода-вывода (getToken,fetch) в любом случае не очень функционально.