Action调用链无报错中断:注册流程数据丢失求助
首先咱们来定位核心问题:你的registerUser函数返回的是一个Redux Thunk函数(也就是那个(dispatch) => {...}箭头函数),但在checkAdminCode里验证通过后,你只是返回了这个Thunk函数,却没有用dispatch去执行它,这就导致内部的console.log('test2')和注册逻辑完全没触发。
具体问题分析
看你这段代码:
if (snapshot.val() === adminCode) { return registerUser(email, password, history, dispatch); }
registerUser执行后返回的是(dispatch) => {...},但你只是把这个函数return出去,没有让它运行。Redux Thunk的机制是:只有当你把Thunk函数传入dispatch时,它才会执行内部的逻辑。
另外还有个小冗余问题:registerUser的参数里已经接收了dispatch,但它又返回了一个接收dispatch的箭头函数,这会导致参数里的dispatch被覆盖,属于没必要的嵌套写法。
修正方案
方案1:正确dispatch registerUser返回的Thunk
把checkAdminCode里的return改成dispatch调用:
if (snapshot.val() === adminCode) { // 用dispatch执行registerUser返回的Thunk函数 return dispatch(registerUser(email, password, history)); }
同时简化registerUser,去掉多余的dispatch参数和外层箭头函数:
const registerUser = (email, password, history) => { return (dispatch) => { dispatch({ type: REGISTER_USER }); firebase.auth().createUserWithEmailAndPassword(email, password) .then((user) => loginUserSuccess(dispatch, history, user)) .catch((err) => loginUserFail(dispatch, err)); }; };
这样registerUser返回的Thunk被dispatch执行后,内部的console.log('test2')和注册逻辑就会正常运行了。
方案2:直接在registerUser里使用传入的dispatch(更简洁)
如果你想保留原有的参数传递方式,也可以调整registerUser,不用返回Thunk,直接执行逻辑:
const registerUser = (email, password, history, dispatch) => { dispatch({ type: REGISTER_USER }); firebase.auth().createUserWithEmailAndPassword(email, password) .then((user) => loginUserSuccess(dispatch, history, user)) .catch((err) => loginUserFail(dispatch, err)); };
然后在checkAdminCode里直接调用它就行:
if (snapshot.val() === adminCode) { return registerUser(email, password, history, dispatch); }
这种方式下,registerUser不再返回Thunk,而是直接利用传入的dispatch触发action和后续逻辑,也能完美解决你的问题。
验证点
修正后你再测试:
registerUser内部的console.log('test2')应该会正常输出REGISTER_USERaction会被正确dispatch- Firebase的注册流程也能正常执行,最终触发
LOGIN_USER_SUCCESS并跳转页面
内容的提问来源于stack exchange,提问作者drkgrntt

