我还不是 thunk 专家,但我可以说的是你的 serverCall 函数必须返回一个带有调度参数的函数(see examples 这里)
你必须在这个子函数中调度一个动作(实际上,调用一个动作创建者,它将把数据置于应用程序状态。
您不必做出明确的承诺,因为 fetch 返回的已经是一个承诺。
我会尝试类似的东西:
export const serverCall = (
url,
method,
body = undefined,
successMessage = undefined
) => {
// your code
return function (dispatch) {
return fetch(url, {
method: method,
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
...(body && { body: JSON.stringify(body) })
}).then(response => response.JSON())
.then(response =>
if (response.ok) {
if (successMessage) {
console.log(successMessage);
}
dispatch(fetchData(response))
} else {
index.js
<Button
onClick={() =>
this.props.serverCall(
"https://jsonplaceholder.typicode.com/users",
"GET"
)
>
如果你使用 Redux,这里的状态将被移除。所有内容都是通过 mapDispatchToProps 从 props 中获取的。
const mapDispatchToProps = dispatch => ({
onLogin: (username, password) => dispatch(login(username, password)),
ToggleIsLoginDialogOpen: IsLoginDialogOpen =>
dispatch(toggleIsLoginDialogOpen(IsLoginDialogOpen)),
serverCall: (url, method) => dispatch(serverCall(url, method))
});