Redux-Saga call方法调用失效问题求助
Redux-Saga中call方法未执行的问题解决
你遇到的问题核心非常明确:调用call effect时没有添加yield关键字,这是Redux-Saga开发中很常见的新手坑。
为什么会出现这个问题?
Redux-Saga里的所有effect函数(比如call、put、take)本质上只是返回一个"描述要执行什么操作"的普通对象,它们本身不会触发任何实际逻辑。必须通过yield把这个对象交给Redux-Saga中间件,由中间件负责解析并执行对应的操作。
你当前的代码里:
call([ NavigatorService, NavigatorService.navigate], 'Tabs' ); // 未被调用
只是创建了一个call effect对象,但没有让中间件去处理它,所以NavigatorService.navigate完全不会执行。而且因为Generator函数的特性,代码会停在这一行,后面的yield put(...)和console.log("done")也都不会运行——这就是为什么你看不到"done"日志的原因。
修正后的代码
只需要给那行call加上yield关键字即可:
function* signUp(action){ try{ const auth = firebase.auth(); const result = yield call([ auth, auth.createUserWithEmailAndPassword], action.user.email, action.user.password ); console.log("signup success") // 此日志已输出 // 添加yield,让中间件执行这个call操作 yield call([ NavigatorService, NavigatorService.navigate], 'Tabs' ); yield put({type: SIGN_UP_SUCCESS, user: action.user}); console.log("done") // 现在这个日志会正常输出了 } catch(error){ const error_message = {code: error.code, message: error.message}; console.log(error_message); yield put({type: AUTHENTICATION_FAILED, error: error_message}); } }
额外优化建议
如果NavigatorService.navigate是一个箭头函数,或者内部没有依赖this上下文,你可以简化call的写法,不需要用数组绑定上下文:
yield call(NavigatorService.navigate, 'Tabs');
这样代码会更简洁易读。
内容的提问来源于stack exchange,提问作者Sumanth Jois
相关产品推荐
相关产品推荐

