используя api fetch с ramda - PullRequest
       32

используя api fetch с ramda

0 голосов
/ 09 октября 2018

Я изучаю Рамду и пытаюсь достичь бессмысленного программирования.Чтобы сделать это, я пытаюсь провести рефакторинг здесь и там, но застрял на этом.

Я, очевидно, думаю, что это не работает, потому что вызов асинхронный, но я не смог найти, что не так с этим кодом.

// Why is this
const toJSONRamda = R.pipe(
  R.prop('json'), // getting the 'json' function
  R.call // and calling it
)

// different from this
const toJSON = response => response.json()

// Works
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(toJSON)
  .then(console.log)
  
// Does not Work
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(toJSONRamda)
  .then(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

1 Ответ

0 голосов
/ 09 октября 2018

Причина, по которой это не работает, заключается в том, что метод json объекта ответа не является чистой функцией.Это действительно метод.Когда вы используете pipe(prop('json'), call), вы пытаетесь вызвать этот метод как чистую функцию.В некоторых обстоятельствах это будет работать.Но здесь метод json фактически использует this.Рамда call не предоставляет объект this.

Существует альтернатива Рамде:

const toJSONRamda = R.invoker(0, 'json')

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(toJSONRamda)
  .then(console.log)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

invoker работает с методами.Это должно помочь описать, как это работает:

R.invoker(0, 'method')(obj) = obj['method']()
R.invoker(1, 'method')(a, obj) = obj['method'](a)
R.invoker(2, 'method')(a, b, obj) = obj['method'](a, b)
//...

Однако, есть важный момент, который нельзя пропустить.Бессмысленное программирование полезно только до тех пор, пока оно улучшает читабельность.Для меня это уже отлично читаемо:

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.json())
  .then(console.log)

Если это всего лишь учебное упражнение, то, конечно, не стесняйтесь пытаться превратить это в бессмысленную версию.Но я бы оставил все как есть для производственного кода.

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