Причина, по которой это не работает, заключается в том, что метод 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)
Если это всего лишь учебное упражнение, то, конечно, не стесняйтесь пытаться превратить это в бессмысленную версию.Но я бы оставил все как есть для производственного кода.