将 fetch api 与 ramda 一起使用
Posted
技术标签:
【中文标题】将 fetch api 与 ramda 一起使用【英文标题】:using the fetch api with ramda 【发布时间】:2019-03-14 07:39:48 【问题描述】:我正在学习 Ramda 并尝试实现无点编程。为了做到这一点,我尝试在这里和那里进行重构,但被卡住了。
我显然认为这不起作用,因为调用是异步的,但我找不到这段代码有什么问题。
// 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】:这不起作用的原因是响应对象的json
方法不是纯函数。这真的是一种方法。当您使用pipe(prop('json'), call)
时,您试图将该方法作为纯函数调用。在某些情况下会起作用。但在这里,json
方法实际上使用了this
。 Ramda 的 call
不提供任何 this
对象。
有一个 Ramda 替代方案:
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)
如果这只是一个学习练习,那么无论如何都可以尝试将其变成一个无积分版本。但我会将其保留为生产代码。
【讨论】:
确实,这仅用于学习目的。感谢您的回答,我学到了一些新东西。非常感谢。以上是关于将 fetch api 与 ramda 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将 fetch 与 async/await 一起使用会返回 [object Object]
尝试发送 json 对象时,fetch api 如何与 express 一起使用
当我将 event.preventDefault() 与 fetch api、express 和 node.js 一起使用时,为啥 req.body 返回 null? [复制]
如何将 React Context API 与 useReducer 一起使用以遵循与 Redux 类似的风格 [关闭]