Redux-saga问题:登录前dispatch(fetchUser)有时无法触发对应saga
排查方向
saga挂载时机问题
90%以上的同类问题都是因为监听fetchUseraction的saga没有在应用初始化时全局挂载,而是被放在了登录后才会触发的逻辑、或者Welcome页所属的路由级动态注入逻辑中。你可以先检查监听fetchUser的saga(即包含takeLatest('fetchUser', handler)/takeEvery('fetchUser', handler)逻辑的代码段)的挂载位置:- 如果是在登录成功回调的fork逻辑、或仅登录后路由才会加载的模块中,就会出现登录前dispatch对应action无响应的问题
- 验证方法:把该saga直接移到根saga中,应用启动时就执行
yield fork(xxxSaga),如果此时登录页dispatch能触发saga逻辑,即可确认是挂载时机问题
action实例不匹配问题
确认两个页面引入的fetchUseraction creator是否来自同一个文件,有没有出现同名但不同源的导出问题:- 在两个页面的
fetchUserLocal方法中分别打印fetchUser().type,对比两个输出值是否完全一致 - 如果type不同,修正引入路径即可解决
- 在两个页面的
中间件拦截问题
检查你是否自定义了权限校验中间件,设置了未登录状态下非白名单action会被拦截的逻辑:- 在对应user reducer中添加日志,确认登录页dispatch的
fetchUseraction是否能走到reducer逻辑 - 如果无法走到reducer,说明action在中间件层被拦截,把
fetchUser加入中间件的未登录白名单即可
- 在对应user reducer中添加日志,确认登录页dispatch的
自定义dispatch包装问题
你代码中已经打印了dispatch(fetchUser())的返回值,对比登录前和登录后打印的返回值结构是否一致,是否被自定义的dispatch增强逻辑修改了action的type属性,导致saga无法匹配监听规则。
内容的提问来源于stack exchange,提问作者Olcay
相关产品推荐
相关产品推荐

