如何在Redux-Observable的Epic中将Store值传入switchMap函数
解决Redux-Observable中switchMap无法获取Store状态的问题
嘿,我一眼就看到你代码里的两个小问题啦,这就是导致你拿不到正确Store状态的核心原因:
问题1:switchMap的参数错误覆盖了外部store
你在switchMap((action, store) => { ... })里重新声明了store参数,但实际上switchMap的回调函数第二个参数是当前流的索引值,不是外部传入的store实例!这就导致你内部的store被覆盖成了数字0(也就是当前action在流里的索引),自然拿不到正确的状态。
问题2:filter操作符的用法不符合要求
你用filter(() => of(store.getState()))是错误的,filter需要返回一个布尔值来判断是否保留当前流的元素,而of(...)会返回一个Observable对象,完全不满足filter的判断逻辑,应该直接基于store.getState()的结果做布尔判断。
正确的解决方案
方案1:直接同步获取当前Store状态
既然外部已经能拿到store实例,直接在switchMap里调用store.getState()即可,注意别再在switchMap的参数里声明store了:
export const addVideoEpic = (action$, store) => action$.ofType(videoTypes.ADD_VIDEO_REQUEST) // 修正filter的写法,根据实际需求判断状态条件 .filter(() => { const state = store.getState(); // 示例:判断url是否存在,可根据你的业务调整逻辑 return !!state.url; }) .switchMap((action) => { // 直接从外部store获取最新状态 const state = store.getState(); const data = { url: state.url }; console.log(state); // 现在能拿到正确的Store状态了 return from(addVideo(data)); });
方案2:用withLatestFrom实现响应式状态获取
如果你希望每次action触发时自动绑定最新的Store状态,更贴合RxJS的响应式编程风格,可以用withLatestFrom操作符将action流和Store状态流合并:
export const addVideoEpic = (action$, store) => action$.ofType(videoTypes.ADD_VIDEO_REQUEST) // 合并action流与Store状态流,每次action触发时拿到最新状态 .withLatestFrom(store, (action, state) => ({ action, state })) // 基于合并后的状态做过滤 .filter(({ state }) => !!state.url) .switchMap(({ action, state }) => { const data = { url: state.url }; console.log(state); return from(addVideo(data)); });
内容的提问来源于stack exchange,提问作者MarJano
相关产品推荐
相关产品推荐

