Reactjs 如何处理Redux';s redux promise中间件在reducer中出现AJAX错误?
在减速器上处理AJAX错误的正确位置是什么?(如果使用Redux加上Reactjs 如何处理Redux';s redux promise中间件在reducer中出现AJAX错误?,reactjs,redux,redux-promise,Reactjs,Redux,Redux Promise,在减速器上处理AJAX错误的正确位置是什么?(如果使用Redux加上Redux承诺中间件) 至少应存在3种类型的错误:网络错误/超时、找不到数据或500内部服务器错误。我试图处理它的方式是: if (action.error) { return state; } 因此,整个减速器是: export default function(state = [], action) { if (action.error) { return state; } swit
Redux承诺
中间件)
至少应存在3种类型的错误:网络错误/超时、找不到数据或500内部服务器错误。我试图处理它的方式是:
if (action.error) {
return state;
}
因此,整个减速器是:
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;
}
}
以上是处理AJAX调用可能出现的所有类型错误的正确方法吗?如果没有,那么什么是正确的方法?I.基本方法:
a) 定义动作创建者:
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) 定义减速器:
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) 容器:
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);
二,。高级方式:
按照nross83在此处所做的那样定义您的中间件:
三、 懒惰的方式:
使用redux promise中间件,因为它扩展了FETCH_DATA以获取_DATA_PENDING、FETCH_DATA_FULLFILLED、FETCH_DATA_内部和外部拒绝。请查看以下示例:
希望这能有所帮助