のために呼び出されてReduxのミドルウェアで、私は、私は同様の非同期呼び出しを呼び出すために使用し、次のミドルウェアがありますPromise.catch無関係減速
:import { callApi } from '../utils/Api';
import generateUUID from '../utils/UUID';
import { assign } from 'lodash';
export const CALL_API = Symbol('Call API');
export default store => next => action => {
const callAsync = action[CALL_API];
if(typeof callAsync === 'undefined') {
return next(action);
}
const { endpoint, types, data, authentication, method, authenticated } = callAsync;
if (!types.REQUEST || !types.SUCCESS || !types.FAILURE) {
throw new Error('types must be an object with REQUEST, SUCCESS and FAILURE');
}
function actionWith(data) {
const finalAction = assign({}, action, data);
delete finalAction[CALL_API];
return finalAction;
}
next(actionWith({ type: types.REQUEST }));
return callApi(endpoint, method, data, authenticated).then(response => {
return next(actionWith({
type: types.SUCCESS,
payload: {
response
}
}))
}).catch(error => {
return next(actionWith({
type: types.FAILURE,
error: true,
payload: {
error: error,
id: generateUUID()
}
}))
});
};
を私は、コンポーネントのcomponentWillMount
で、次の呼び出しを作っていますミドルウェアによって処理されたアクションを派遣する例えば
componentWillMount() {
this.props.fetchResults();
this.props.fetchTeams();
}
fetchTeams
は、それは次のようになります。
export function fetchTeams() {
return (dispatch, getState) => {
return dispatch({
type: 'CALL_API',
[CALL_API]: {
types: TEAMS,
endpoint: '/admin/teams',
method: 'GET',
authenticated: true
}
});
};
}
成功のアクションが両方ともディスパッチされ、新しい状態がレデューサーから返されます。両方の減速は、同じように見えると以下Teams
減速される:
render() {
<div>
<Autocomplete items={teams}/>
</div>
}
オートコンプリートはそのcomponentWillMount
でアクションをディスパッチ:
class Autocomplete extends Component{
componentWillMount() {
this.props.dispatch(actions.init({ props: this.exportProps() }));
}
export const initialState = Map({
isFetching: false,
teams: List()
});
export default createReducer(initialState, {
[ActionTypes.TEAMS.REQUEST]: (state, action) => {
return state.merge({isFetching: true});
},
[ActionTypes.TEAMS.SUCCESS]: (state, action) => {
return state.merge({
isFetching: false,
teams: action.payload.response
});
},
[ActionTypes.TEAMS.FAILURE]: (state, action) => {
return state.merge({isFetching: false});
}
});
成分は、その後、別のアクションをディスパッチする別のコンポーネントを描画します
SUCCESSレデューサーがのために呼び出された後に呼び出されるオートコンプリートレデューサーでエラーが発生します。とfetchResults
親コンポーネントのcomponentWillUpdate
の元呼び出しからではなく最初のコードスニペットからミドルウェアでのcatchハンドラが呼び出され、何らかの理由:catchハンドラとして呼び出されている理由
return callApi(endpoint, method, data, authenticated).then(response => {
return next(actionWith({
type: types.SUCCESS,
payload: {
response
}
}))
}).catch(error => {
return next(actionWith({
type: types.FAILURE,
error: true,
payload: {
error: error,
id: generateUUID()
}
}))
});
};
私は理解していません私はこの時点で約束が解決されたと思ったでしょう。
本当に正しいです。私は次のチックでアクションをディスパッチするときに正しいスタックトレースを取得します。 ループには、使用しているキューがいくつかあると思います。私はそれを掘り下げるつもりです。ご協力ありがとうございました。 – dagda1