首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理redux中的redux承诺中间件AJAX错误?

如何处理redux中的redux承诺中间件AJAX错误?
EN

Stack Overflow用户
提问于 2017-04-02 14:37:32
回答 1查看 963关注 0票数 0

在还原器上处理AJAX错误的合适位置是什么?(如果使用Redux加上redux-promise中间件)。

至少应该有3种类型的错误:网络错误/超时、未找到数据或500内部服务器错误。我处理这件事的方法是:

代码语言:javascript
复制
  if (action.error) {
    return state;
  }

所以整个减速机是:

代码语言:javascript
复制
export default function(state = [], action) {

  if (action.error) {
    return state;
  }

  switch (action.type) {
    case FETCH_WEATHER:
      return [action.payload.data].concat(state);
    default:
      return state;
  }

}

以上是处理调用所能产生的所有类型错误的正确方法吗?如果没有,那么什么是正确的方法?

EN

回答 1

Stack Overflow用户

发布于 2017-05-26 04:04:49

一.基本方式:

( a)定义您的行为创建者:

代码语言:javascript
复制
import axios from 'axios';

//Post list
export const FETCH_DATA = 'FETCH_DATA';
export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
export const FETCH_DATA_FAILURE = 'FETCH_DATA_FAILURE';

const ROOT_URL = 'foo/bar';
export function fetchPosts() {
  const request = axios({
    method: 'get',
    url: `${ROOT_URL}/data`,
    headers: []
  });

  return {
    type: FETCH_DATA,
    payload: request
  };
}

export function fetchDataSuccess(data) {
  return {
    type: FETCH_DATA_SUCCESS,
    payload: data
  };
}

export function fetchDataFailure(error) {
  return {
    type: FETCH_DATA_FAILURE,
    payload: error
  };
}

( b)界定减速器:

代码语言:javascript
复制
import { FETCH_DATA, FETCH_DATA_SUCCESS, FETCH_DATA_FAILURE } from 'pathToActionTypes';
export default function(state = INITIAL_STATE, action) {
  let error;
  switch(action.type) {

  case FETCH_DATA: // start fetching and set fetching = true
    return { ...state, dataObj: {data:[], error: null, fetching: true} }; 
  case FETCH_DATA_SUCCESS:// return data and set fetching = false
    return { ...state, dataObj: {data: action.payload, error:null, fetching: false} };
  case FETCH_DATA_FAILURE:// return error and set fetching = false
    error = action.payload || {message: action.payload.message}; // message could be provided if network/server down errors
    return { ...state, dataOjb: {data: [], error: error, fetching: false} };
  default:
    return state;
  }
}

( c)集装箱:

代码语言:javascript
复制
import { connect } from 'react-redux'
import { fetchData, fetchDataSuccess, fetchDataFailure } from 'pathToActionCreators';    
import FooBarComponent from '../components/foo_bar_component';


const mapStateToProps = (state) => {
  return { 
    fooBar: state.dataObj.data
  };
}

const mapDispatchToProps = (dispatch) => {
  return {
    fetchData: () => {
      dispatch(fetchData()).then((response) => {
            !response.error ? 
            dispatch(fetchDataSuccess(response.payload.data)) : 
            dispatch(fetchDataFailure(response.payload.data));
          });
    }
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(FooBarComponent);

II.高级方法:像nross83在这里所做的那样,自己定义中间件:Redux: Using async middlewares vs dispatching actions on success functions

懒惰的方式:使用redux-允诺中间件,因为它将FETCH_DATA扩展到FETCH_DATA_PENDING、FETCH_DATA_FULLFILLED、FETCH_DATA_REJECTED内部和外部。请查看https://github.com/pburtchaell/redux-promise-middleware/tree/master/examples上的示例

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43169576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档