Redux 在运行时动态添加史诗会多次调用新添加的史诗

Redux 在运行时动态添加史诗会多次调用新添加的史诗,redux,rxjs,redux-observable,Redux,Rxjs,Redux Observable,我的工作基于以下方向: 所以我在让这个测试执行史诗时遇到了一个问题,我遗漏了什么吗?在任何情况下,代码都会解释发生了什么 我希望调用tostore.dispatch({type:'GO'})来链接我所有的史诗。我看到我的减速机已经连接好了,但是Epics没有被调用 仅供参考,我需要这个来测试我认为是错误的东西。在我的实际应用程序中,当我使用epicLoader$动态加载一个新的epic时。next()动态加载的epic现在被调用两次。。。但在这个测试成功之前,我无法证明这一点 作为一种解决方法,

我的工作基于以下方向:

所以我在让这个测试执行史诗时遇到了一个问题,我遗漏了什么吗?在任何情况下,代码都会解释发生了什么

我希望调用to
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!很高兴,谢谢你的确认。