React Native Ignite登录功能报错:ReferenceError: call未定义
call is not defined报错 嘿,刚上手React Native Ignite模板就踩这个坑确实有点闹心,我帮你拆解下问题根源和解决办法~
这个ReferenceError: call is not defined错误很明确:在你的登录逻辑(结合takeLatest来看,应该是Redux Saga代码里),你使用了call这个函数,但要么没正确导入它,要么拼写错误了。Ignite模板默认用Redux Saga处理异步逻辑,call是Saga提供的核心effect,必须从redux-saga/effects导入才能用。
步骤1:检查Saga文件的导入语句
找到你的登录相关Saga文件(比如src/sagas/LoginSaga.js或者类似路径),确认顶部的导入是否包含call:
// 正确的导入方式,必须包含call import { takeLatest, call, put } from 'redux-saga/effects' import api from '../Services/Api' import { LOGIN_REQUEST, loginSuccess, loginFailure } from '../Redux/LoginRedux'
如果之前漏写了call,补上之后这个错误大概率会消失。
步骤2:确认Saga中调用API的代码正确
在处理登录请求的saga generator函数里,调用API的部分必须用yield call(...)的格式,比如:
function* loginSaga(action) { try { // 用call包裹API调用,第一个参数是API方法,第二个是传递的参数 const response = yield call(api.login, action.payload) if (response.ok) { // 登录成功,派发成功action yield put(loginSuccess(response.data)) } else { // 处理API返回的错误 yield put(loginFailure(response.data.error)) } } catch (error) { // 处理网络或其他异常 yield put(loginFailure('网络异常,请稍后重试')) } }
这里要注意api.login必须是你在Api.js中定义好的方法,不能拼写错误。
步骤3:完善Api.js中的登录方法
回到你提供的Api.js代码,需要确保你在create函数里定义并导出了login方法,比如:
import apisauce from 'apisauce' const create = (baseURL = 'http://localhost:4200/') => { // 创建apisauce实例 const api = apisauce.create({ baseURL, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, timeout: 10000 }) // 定义登录接口:POST请求到/auth/login,传入用户账号密码等数据 const login = (userCredentials) => api.post('/auth/login', userCredentials) // 暴露所有需要的API方法 return { login } } export default { create }
另外,要确认你的Express后端的/auth/login接口是正常运行的,避免后续出现API请求失败的问题。
步骤4:检查Saga Watcher的配置
最后确认你的saga watcher正确监听了登录请求的action:
export function* watchLogin() { // takeLatest会取消之前未完成的登录请求,只处理最新的一次 yield takeLatest(LOGIN_REQUEST, loginSaga) }
这里的LOGIN_REQUEST要和你在Redux action中定义的类型完全一致。
按照这几步排查下来,应该就能解决call is not defined的报错啦~
内容的提问来源于stack exchange,提问作者Ragam Gram

