daz*_*ous 10 javascript reactjs redux redux-thunk redux-promise
我正在尝试发送一个动作.我找到了一些行动的例子,但没有我的那么复杂.
你能给我一个暗示吗?我究竟做错了什么?
我正在使用TypeScript,并且最近删除了所有类型并尽可能地简化了我的代码.
我正在使用redux-thunk和redux-promise,如下所示:
import { save } from 'redux-localstorage-simple';
import thunkMiddleware from 'redux-thunk';
import promiseMiddleware from 'redux-promise';
const middlewares = [
save(),
thunkMiddleware,
promiseMiddleware,
];
const store = createStore(
rootReducer(appReducer),
initialState,
compose(
applyMiddleware(...middlewares),
window['__REDUX_DEVTOOLS_EXTENSION__'] ? window['__REDUX_DEVTOOLS_EXTENSION__']() : f => f,
),
);
Run Code Online (Sandbox Code Playgroud)
组件 - Foo组件:
import actionFoo from 'js/actions/actionFoo';
import React, { Component } from 'react';
import { connect } from 'react-redux';
class Foo {
constructor(props) {
super(props);
this._handleSubmit = this._handleSubmit.bind(this);
}
_handleSubmit(e) {
e.preventDefault();
this.props.doActionFoo().then(() => {
// this.props.doActionFoo returns undefined
});
}
render() {
return <div onClick={this._handleSubmit}/>;
}
}
const mapStateToProps = ({}) => ({});
const mapDispatchToProps = {
doActionFoo: actionFoo,
};
export { Foo as PureComponent };
export default connect(mapStateToProps, mapDispatchToProps)(Foo);
Run Code Online (Sandbox Code Playgroud)
行动 - actionFoo:
export default () => authCall({
types: ['REQUEST', 'SUCCESS', 'FAILURE'],
endpoint: `/route/foo/bar`,
method: 'POST',
shouldFetch: state => true,
body: {},
});
Run Code Online (Sandbox Code Playgroud)
行动 - AuthCall:
// extremly simplified
export default (options) => (dispatch, getState) => dispatch(apiCall(options));
Run Code Online (Sandbox Code Playgroud)
行动 - ApiCall:
export default (options) => (dispatch, getState) => {
const { endpoint, shouldFetch, types } = options;
if (shouldFetch && !shouldFetch(getState())) return Promise.resolve();
let response;
let payload;
dispatch({
type: types[0],
});
return fetch(endpoint, options)
.then((res) => {
response = res;
return res.json();
})
.then((json) => {
payload = json;
if (response.ok) {
return dispatch({
response,
type: types[1],
});
}
return dispatch({
response,
type: types[2],
});
})
.catch(err => dispatch({
response,
type: types[2],
}));
};
Run Code Online (Sandbox Code Playgroud)
Redux Thunk中间件允许您编写返回函数而不是动作的动作创建者
所以这意味着它不能处理你的承诺.你必须添加redux-promise承诺支持
默认导出是中间件功能.如果收到承诺,它将分配承诺的已解决值.如果承诺拒绝,它不会发送任何东西.
redux-thunkvs 之间的区别redux-promise你可以在这里阅读
好吧,几个小时后,我找到了解决方案。redux-thunk 必须先于任何其他中间件。因为中间件是从右到左调用的,所以 redux-thunk 返回是链中的最后一个,因此返回 Promise。
import thunkMiddleware from 'redux-thunk';
const middlewares = [
thunkMiddleware,
// ANY OTHER MIDDLEWARE,
];
const store = createStore(
rootReducer(appReducer),
initialState,
compose(
applyMiddleware(...middlewares),
window['__REDUX_DEVTOOLS_EXTENSION__'] ? window['__REDUX_DEVTOOLS_EXTENSION__']() : f => f,
),
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |