Rxjs 如何取消epic以避免多个实例

Rxjs 如何取消epic以避免多个实例,rxjs,redux-observable,rxjs6,Rxjs,Redux Observable,Rxjs6,我有以下史诗(顺便说一下?) 其中,orderseceived是一个操作创建者,它将与paylod一起运行,mockOrders返回一些模拟负载 当我调用FETCH\u ORDERS操作时,这个史诗开始,然后每隔2秒ordersReceived就被发送一次,这很好。但是,当我再次启动此操作时,我注意到ordersReceived被调用的频率更高,很明显,我创建了多个实例,这些实例现在启动单独的操作。现在,有没有办法取消之前的epic通话 编辑 我在中发现,我必须使用史诗将作出反应的另一个动作,例

我有以下史诗(顺便说一下?)

其中,
orderseceived
是一个操作创建者,它将与paylod一起运行,
mockOrders
返回一些模拟负载

当我调用
FETCH\u ORDERS
操作时,这个史诗开始,然后每隔2秒
ordersReceived
就被发送一次,这很好。但是,当我再次启动此操作时,我注意到ordersReceived被调用的频率更高,很明显,我创建了多个实例,这些实例现在启动单独的操作。现在,有没有办法取消之前的epic通话

编辑 我在中发现,我必须使用史诗将作出反应的另一个动作,例如

const fetchOrders = (action$, state) => {
  console.log('fetchOrders', state);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    mergeMap(action => interval(2001).pipe(
      map(_ => ordersReceived(cloneOrders())),


      takeUntil(action$.pipe(
        filter(action => action.type === FETCH_ORDERS_CANCELLED)
      ))


    ))
  );
};
然后在某处调用
dispatch({type:FETCH\u ORDERS\u CANCELLED})

这很好,但我在想一些更自动的东西:)因此对
fetchOrders
的调用将停止以前调用的任何东西。

就是您要寻找的。它将取消以前的可观测值,并发出新的值

const fetchOrders = action$ => {
  console.log('fetchOrders', action$);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    switchMap(action => interval(2000).pipe(
      map(_ => ordersReceived(mockOrders()))
    ))
  );
};

您是否可以尝试使用
开关映射
而不是
合并映射
const fetchOrders = action$ => {
  console.log('fetchOrders', action$);
  return action$.pipe(
    ofType(FETCH_ORDERS),
    switchMap(action => interval(2000).pipe(
      map(_ => ordersReceived(mockOrders()))
    ))
  );
};