Функциональное программирование на JavaScript: как обрабатывать выборки (для каналов) - PullRequest
0 голосов
/ 24 февраля 2019

В настоящее время я изучаю функциональное программирование на 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.Как бы вы решили эту проблему функционально?

...