Redux 在运行时动态添加史诗会多次调用新添加的史诗
我的工作基于以下方向: 所以我在让这个测试执行史诗时遇到了一个问题,我遗漏了什么吗?在任何情况下,代码都会解释发生了什么 我希望调用toRedux 在运行时动态添加史诗会多次调用新添加的史诗,redux,rxjs,redux-observable,Redux,Rxjs,Redux Observable,我的工作基于以下方向: 所以我在让这个测试执行史诗时遇到了一个问题,我遗漏了什么吗?在任何情况下,代码都会解释发生了什么 我希望调用tostore.dispatch({type:'GO'})来链接我所有的史诗。我看到我的减速机已经连接好了,但是Epics没有被调用 仅供参考,我需要这个来测试我认为是错误的东西。在我的实际应用程序中,当我使用epicLoader$动态加载一个新的epic时。next()动态加载的epic现在被调用两次。。。但在这个测试成功之前,我无法证明这一点 作为一种解决方法,
store.dispatch({type:'GO'})
来链接我所有的史诗。我看到我的减速机已经连接好了,但是Epics没有被调用
仅供参考,我需要这个来测试我认为是错误的东西。在我的实际应用程序中,当我使用epicLoader$动态加载一个新的epic时。next()
动态加载的epic现在被调用两次。。。但在这个测试成功之前,我无法证明这一点
作为一种解决方法,我已经手动添加了我想要动态添加的史诗,效果很好,但这不可能超过我的POC阶段。我需要从将推送到应用程序的单独文件中加载史诗
帮我欧比万
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/mapTo';
import 'rxjs/add/operator/do';
import { Observable } from 'rxjs/Observable';
import {combineReducers, createStore, applyMiddleware} from 'redux';
import { createEpicMiddleware,combineEpics } from 'redux-observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
test('dynamicly loading epic calls it twice',done => {
let epic1 = (action$)=>action$
.ofType('GO')
.do((action)=>console.log('epic1',action))
.mapTo({type:'EPIC1'});
let epic2 = (action$,{epicLoader$})=>action$
.ofType('EPIC1')
.do((action)=>console.log('epic2',action))
.do(()=>epicLoader$.next(epic3))
.do(()=>epicLoader$.next(epic4))
.mapTo({type:'EPIC2'});
let epic3 = (action$)=>action$
.ofType('EPIC2')
.do((action)=>console.log('epic3',action))
.mapTo({type:'EPIC3'});
let epic4 = (action$)=>action$
.ofType('EPIC2')
.do((action)=>console.log('epic4',action))
.do(()=>done())
.mapTo({type:'EPIC4'});
const epic$ = new BehaviorSubject(combineEpics({epic1,epic2}));
const rootEpic = (action$, store, args) =>
epic$.mergeMap(epic =>
epic(action$, store, args)
);
const epicMiddleware = createEpicMiddleware(rootEpic,
{ dependencies: {
epicLoader$: epic$,
}});
const reducer =(state = {},action)=>{
console.log('reducer',action);
return state;
};
const store = createStore(
combineReducers({
reducer
}),
applyMiddleware(epicMiddleware)
);
//start up the chain of events.
store.dispatch({type:'GO'});
});
我认为我看到提供的代码存在两个问题: 向
组合EEPICS
提供对象,而不仅仅是参数
您正在将一个对象传递给combineEpics
,但它应该只是普通的旧参数。这与组合减速机不同
// bad
const epic$ = new BehaviorSubject(combineEpics({epic1,epic2}));
// good
const epic$ = new BehaviorSubject(combineEpics(epic1,epic2));
此处讨论了对传递对象的支持:。它还没有得到支持,因为键将是无意义的,不像combinereducer
当订阅rootEpic时,这实际上会抛出一个错误,但不幸的是,由于
分解存储
而不是第三个dependencies参数
一旦这些问题得到解决,它就会按照需要工作: 我确实注意到,
epic4
正在收听EPIC2
,您可能真的想收听EPIC3
我认为我看到提供的代码存在两个问题: 向
组合EEPICS
提供对象,而不仅仅是参数
您正在将一个对象传递给combineEpics
,但它应该只是普通的旧参数。这与组合减速机不同
// bad
const epic$ = new BehaviorSubject(combineEpics({epic1,epic2}));
// good
const epic$ = new BehaviorSubject(combineEpics(epic1,epic2));
此处讨论了对传递对象的支持:。它还没有得到支持,因为键将是无意义的,不像combinereducer
当订阅rootEpic时,这实际上会抛出一个错误,但不幸的是,由于
分解存储
而不是第三个dependencies参数
一旦这些问题得到解决,它就会按照需要工作: 我确实注意到,
epic4
正在收听EPIC2
,您可能真的想收听EPIC3
好的,我已经确认,动态添加的史诗实际上在快速连续两次使用相同的操作调用。好的,我已经确认,动态添加的史诗实际上在快速连续两次使用相同的操作调用。是的,这就是解决方案。@RobelRobelLingstuyl yay!非常高兴,谢谢您的确认。是的,这就是解决方案。@RobelRobelLingstuyl-yay!很高兴,谢谢你的确认。