Функциональное программирование JavaScript: как обрабатывать выборку (для каналов)

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

pipe/compose не работают с функциями, которые принимают несколько аргументов или не имеют аргументов. Только не используйте их здесь. Обратите внимание, что выполнение ввода-вывода (getToken, fetch) в любом случае не очень функционально.
Bergi 24.02.2019 14:47

@Берги Спасибо ?

J. Hesters 25.02.2019 08:25

Не могли бы вы написать типы? Кроме того, было бы полезно увидеть ваш код целиком.

Aadit M Shah 01.03.2019 06:27

@AaditMShah Что вы имеете в виду под типами? Я использую чистый JavaScript.

J. Hesters 01.03.2019 08:45

Да, но даже если вы используете чистый JavaScript, вы должны думать о типах в своей голове.

Aadit M Shah 01.03.2019 09:41

Итак, route — это строка, body — объект, token — строка.

J. Hesters 01.03.2019 09:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
6
573
1

Ответы 1

Вот способ написать желаемый код, хотя это и не 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 — это ваша собственная библиотека?

Bergi 26.05.2020 23:45

rubico больше не моя собственная библиотека

richytong 26.05.2020 23:46

Переместить его в организацию — хорошая идея, но зачем удалять ссылку, а не обновлять ее? Кроме того, вы запустили библиотеку и до сих пор являетесь единственным участником, вы должны взять на себя ответственность.

Bergi 26.05.2020 23:51

хорошо, теперь, когда вы так выразились, я отредактирую пост, чтобы поставить новую ссылку! также я достал некоторые объяснения, потому что я думал, что звучал съеживаясь

richytong 26.05.2020 23:52

Другие вопросы по теме