Redux中异步action怎么处理?dispatch后没反应怎么办?
我在用Redux写一个登录功能,调用接口是异步的,但发现直接在action里写async/await然后dispatch,组件那边完全收不到状态更新。我试过把请求放在action creator里,也装了redux-thunk中间件,但还是不行。
比如我这样写:
const login = async (credentials) => {
const res = await fetch('/api/login', { method: 'POST', body: JSON.stringify(credentials) });
const data = await res.json();
return { type: 'LOGIN_SUCCESS', payload: data };
};
然后在组件里dispatch(login(creds)),结果控制台报错说不能dispatch一个Promise。是不是我哪里搞错了?
你装了
redux-thunk是对的,但关键是你写的login还是普通的 async 函数,它返回的是一个 Promise,不是 thunk(也就是不是返回一个函数的 action creator)。正确的写法应该是这样:
然后组件里直接
dispatch(login(creds))就行。注意几个关键点:
action creator 不再是 async 函数,而是返回一个函数,这个函数接收
dispatch和getState作为参数,这个函数本身才是 thunk;所有异步逻辑都包在这个返回的函数里,用
dispatch分发不同阶段的 action;中间件
redux-thunk会识别出这个返回的函数,并自动调用它,把dispatch注入进去。你之前的问题就是没让 action creator 返回一个函数,而是直接返回了 Promise,Redux 不知道怎么处理,所以报错了。这种写法在实际项目里挺常见的,一开始容易搞混。