在还原器上处理AJAX错误的合适位置是什么?(如果使用Redux加上redux-promise中间件)。
至少应该有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;
}
}以上是处理调用所能产生的所有类型错误的正确方法吗?如果没有,那么什么是正确的方法?
发布于 2017-05-26 04:04:49
一.基本方式:
( 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);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上的示例
希望这能帮上忙。
https://stackoverflow.com/questions/43169576
复制相似问题