将 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]

将 Fetch 与授权标头和 CORS 一起使用

尝试发送 json 对象时,fetch api 如何与 express 一起使用

当我将 event.preventDefault() 与 fetch api、express 和 node.js 一起使用时,为啥 req.body 返回 null? [复制]

如何将 React Context API 与 useReducer 一起使用以遵循与 Redux 类似的风格 [关闭]

将 fetch 与变量一起使用 [重复]