使用 redux-promise 处理 redux 错误的正确方法

Posted

技术标签:

【中文标题】使用 redux-promise 处理 redux 错误的正确方法【英文标题】:Proper way to handle errors in redux using redux-promise 【发布时间】:2019-10-20 10:13:00 【问题描述】:

我正在尝试“redux-promise”。 当流程中没有错误时,我的代码可以正常工作。但是,假设 API 已关闭,或者我的 URL 中有错字。在这些情况下,我希望以正确的方式处理错误。

这是API:https://jsonplaceholder.typicode.com/users (在 sn-p 中,我在末尾添加随机文本以生成 404)

动作创建者

export async function fetchUsers() 

  const request = await axios
    .get('https://jsonplaceholder.typicode.com/userssdfdsfdsf')
    .catch(error => console.log('ERROR', error))

  return 
    type: FETCHING_USERS,
    payload: request
  ;

减速器

export default (state = [], action) => 
  switch (action.type) 
    case FETCHING_USERS:
      return [...state, ...action.payload.data]

    default:
      return state
  

我可以看到控制台中记录的错误

ERROR Error: Request failed with status code 404

但是,一旦动作被分派,它的有效载荷是undefined

action type: "FETCHING_USERS", payload: undefined

我不知道处理这个问题的最佳位置在哪里:动作创建器、reducer 等。我不应该检查有效负载是否在 reducer 中,如果不是,则返回状态或什么都不做。我想了解哪种方法是处理此问题的最佳方法。

【问题讨论】:

【参考方案1】:

你可以看看redux-promise的source,很简单。

Redux-promise 期望 promise 或将有效负载设置为某个 promise 的操作。我想你会使用字母大小写。

代码可能看起来像(只是示例,未经测试):

export function fetchUsers() 

    const request = axios.get('https://jsonplaceholder.typicode.com/userssdfdsfdsf');

    return 
        type: FETCHING_USERS,
        payload: request
    ;

在这种情况下,redux-promise 将等待 axios.get 返回的 promise 的解析并调度您的操作,但 payload 替换为 promise 结果。如果出现错误,redux-promise 将捕获它并使用 error = true 调度操作(您可能希望在 reducer 中处理 action.error === true 情况)

【讨论】:

【参考方案2】:

在reducer中你应该检查错误字段的存在:

export default function(state = null, action) 
  if (action.error) 
    //handle
    
  switch(action.type) 

【讨论】:

【参考方案3】:

此代码用于操作。

export const fetchUsers = () => async dispatch => try const res = await axios.get('https://jsonplaceholder.typicode.com/userssdfdsfdsf'); dispatch( type: FETCHING_USERS, payload: res.data ); catch (err) dispatch( type: FETCHING_ERROR ); ;

在减速器中这样做。 定义初始状态并使用此代码。

export default function(state = initialState, action) 
  const  type, payload  = action;

  switch (type) 
    case FETCHING_USERS:
      return 
        ...state,
        loading: false,
        user: payload,

      ;
case FETCH_ERROR:
      return 
        ...state,
        token: null,
        loading: false,
      ;

【讨论】:

以上是关于使用 redux-promise 处理 redux 错误的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 redux-promise 继续获得未定义的 'dispatch'

redux-promise:未捕获的 TypeError:中间件不是函数

使用 redux-promise 调用 API 时 Redux 状态未更新

如何使用 redux 和 redux-promise 将多个 axios 调用合并到一个有效负载中?

同时启用 redux-promise 和 redux-saga 中间件似乎会导致问题

React-redux 项目 - 链式依赖异步调用不适用于 redux-promise 中间件?