【问题标题】:JavaScript functional programming: How to handle fetch (for pipes)JavaScript 函数式编程:如何处理 fetch(对于管道)
【发布时间】:2019-07-18 00:53:29
【问题描述】:

我目前正在学习 JavaScript 中的函数式编程。我用 ramda 作为 helper 库来写 helper 比如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 是静态的,我可以将这个函数 curry 并在这样的管道中使用它:

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 不适用于带有多个参数或不带参数的函数。只是不要在这里使用它们。请注意,做 IO(getToken,fetch)无论如何都不是很实用。
  • @Bergi 谢谢????
  • 你能发布类型吗?此外,完整地查看您的代码会很有帮助。
  • @AaditMShah 类型是什么意思?我使用纯 JavaScript。
  • 是的,但是即使您使用纯 JavaScript,您也必须在脑海中考虑类型。

标签: javascript functional-programming fetch-api currying ramda.js


【解决方案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 来表达像你这样的复杂异步情况。

【讨论】:

  • 为什么要删除所有的解释,以及 rubico 是你自己的库的披露?
  • rubico 不再是我自己的库
  • 将其移至组织是个好主意,但为什么要删除链接而不是更新它呢?另外,你已经启动了这个库,并且到目前为止仍然是唯一的贡献者,你应该接受这个功劳。
  • 好吧,既然您这样说,我将编辑帖子以放置新链接!我也拿出了一些解释,因为我觉得我听起来很畏缩
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 2017-01-16
  • 2011-06-06
  • 2018-06-15
  • 2011-06-14
  • 1970-01-01
  • 2011-07-19
  • 2018-07-07
相关资源
最近更新 更多