如何在saga文件中获取Redux state用于API调用
问题核心原因
redux-saga 提供的 select 效应器只能在 saga 生成器函数内部通过 yield 调用,无法在普通异步函数中直接执行获取 Redux state,这是原有写法不生效的根本原因。
解决方案
推荐将API调用函数和Redux逻辑解耦,需要用到的state字段在saga中获取后作为入参传入API函数,修正后的代码如下:
// 把需要的Redux state字段作为入参传入,不耦合Redux逻辑,复用性更高 async function getApi(cityParam) { try { const callByCity = await fetch(`https://www.test.com/APICALL${cityParam}`) const result = await callByCity.json() return result } catch(error) { console.log(error.message) throw error // 手动抛出错误,saga的catch分支才能捕获接口异常 } } function* fetchMainCity(action) { try { // 在saga生成器内用select获取需要的state字段 // 写法1:直接获取指定字段,性能更优,示例取state.cityModule.mainCity const mainCity = yield select(state => state.cityModule.mainCity) // 写法2:也可以先拿整个state再取对应字段 // const state = yield select() // const mainCity = state.cityModule.mainCity // 调用API时把拿到的state字段作为参数传入 const result = yield call(getApi, mainCity); yield put({ type: "GET_CITY_SUCCESS", result: result }) } catch (e) { yield put({type: "GET_CITY_FAILED", message: "Sorry, We Have A Problem."}) } }
注意事项
- 如果有多处场景需要调用该API且都依赖同一个state字段,可以把「取state+调接口」的逻辑封装成独立的saga生成器复用
- 不要在普通异步函数中直接调用saga的效应器,所有saga效应器都必须在生成器内通过
yield执行
内容的提问来源于stack exchange,提问作者BarakOren
相关产品推荐
相关产品推荐

