You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:07:42