【问题标题】:Fetching data with redux actions使用 redux 操作获取数据
【发布时间】:2016-07-25 15:17:58
【问题描述】:

我在内部遇到了一个问题,即如何构建通过 rest api 获取数据的 redux 操作。

我正在获取各种数据,例如

  • 所有帖子已发布
  • 一个奇异的帖子
  • 所有当前用户
  • 搜索结果

我想知道我是创建一个从每个端点获取数据的操作,还是创建一个从提供的路由获取数据的单一提取操作?

当前实施:

function requestPosts(site) {
return {
    type: REQUEST_POSTS,
    site
}

function fetchPosts(site) {
return dispatch => {
    dispatch(requestPosts(site))
    return fetch(`http://notareallink.com/posts`)
        .then( response => response.json() )
        .then( json => dispatch( receivePosts( site, json ) ) )
}

function requestPost(site) {
return {
    type: REQUEST_POST,
    site
}

function fetchPost(site) {
return dispatch => {
    dispatch(requestPost(site))
    return fetch(`http://notareallink.com/post/post-id`)
        .then( response => response.json() )
        .then( json => dispatch( receivePost( site, json ) ) )
}

function requestUsers(site) {
return {
    type: REQUEST_USERS,
    site
}

function fetchUsers(site) {
return dispatch => {
    dispatch(requestUsers(site))
    return fetch(`http://notareallink.com/users`)
        .then( response => response.json() )
        .then( json => dispatch( receiveUsers( site, json ) ) )
}

对我来说,这感觉就像一堆重复的代码基本上在做同样的事情(从端点获取数据)。

这是正确的方法吗,还是我应该创建一个单独的操作来获取数据并将其传递给相关路由?

如果这不是很清楚,我很抱歉,但我在输入此内容时试图绕开这个问题。

【问题讨论】:

  • 我认为重复不是多个操作,而是您重复的 API 调用例程。您可以尝试的一件事是将 fetch().then().then() 抽象到 API 模块中,这样您的动作创建者将只调用该函数而不是一遍又一遍地编写相同的行。

标签: javascript reactjs redux react-redux


【解决方案1】:

所有这些只是可以调用另一个函数来处理重复任务而不重复代码的函数。

首先,您需要提取重复的fetch 调用。

const callAPI = url => fetch(`http://notareallink.com/${url}`).then(res => res.json())

为避免重复动作调度,您可以使用中间件。看来您已经有了thunk 中间件。您可以添加自己的包或使用包。

const promiseMiddleware = ({dispatch}) => next => action => {
   const {promise, pending, success, fail} = action
   if(promise) {
     dispatch(pending());
     promise.then(
       res => dispatch(success(res)),
       err => dispatch(fail(err))
     )
   }
   return next(action)
}

并像这样使用它

const requestPosts = () => ({ type: REQUEST_POSTS })
const recievePosts = posts => ({ type: RECIEVE_POSTS, posts })
const requestPostsFail = reason => ({ type: REQUEST_POSTS_FAIL, reason })

const fetchPosts = () => dispatch => dispatch({
  promise: callAPI('posts'),
  pending: requestPosts,
  success: receivePosts,
  fail: requestPostsFail
})

【讨论】:

  • 感谢 Yury 的回答,但我注意到在我最初获取帖子列表时,我在为 FetchPosts 创建的商店中拥有我需要的所有数据。我可以从 fetchPosts 存储中的存储 IF 获取我想要的帖子数据并使用该数据创建一个新存储,但是 IF 它尚未在 fetchPosts 存储中然后获取单个帖子数据并将其添加到帖子存储中?
  • 这最终对我有用。非常感谢
猜你喜欢
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2022-06-14
  • 2017-11-05
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多