【发布时间】:2018-06-14 16:09:49
【问题描述】:
我正在尝试调度一个动作。我找到了一些操作的工作示例,但没有我的那么复杂。
你能给我一个提示吗?我做错了什么?
我正在使用 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,
),
);
组件 - 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);
动作 - actionFoo:
export default () => authCall({
types: ['REQUEST', 'SUCCESS', 'FAILURE'],
endpoint: `/route/foo/bar`,
method: 'POST',
shouldFetch: state => true,
body: {},
});
操作 - AuthCall:
// extremly simplified
export default (options) => (dispatch, getState) => dispatch(apiCall(options));
动作 - 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],
}));
};
【问题讨论】:
-
console.log(res.json())返回什么? -
这是一个承诺。一个已解决的
-
您的调试器是否告诉您在
undefined上调用了哪个then? -
自从我使用 redux thunk 已经有一段时间了,我不确定,但我的猜测是 actionFoo 应该返回一个调度调用而不是直接调用 authCall 操作。也许这个例子(很久以前写的)可以帮助你:github.com/svenvandescheur/react-redux-consumerjs-example
-
@JoshuaR。当然,一个:this.props.doActionFoo(gameName, password).then() 我已经在上面的代码中注释了
标签: javascript reactjs redux redux-thunk redux-promise