如何取消史诗以避免多个实例

How to cancel epic to avoid multiple instances

我有以下史诗(顺便说一句。why epic?)

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

其中 ordersReceived 是一个动作创建者,意味着 运行 带有有效载荷,mockOrders returns 一些模拟有效载荷。

当我调用 FETCH_ORDERS 操作时,此史诗开始,然后每 2 秒调度一次 ordersReceived,这很好。但是,当我再次触发此操作时,我注意到调用 ordersReceived 的频率更高,显然我已经创建了多个实例,这些实例现在触发单独的操作。现在,有什么方法可以取消之前的史诗通话吗?

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

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_ORDERS_CANCELLED})

没问题,但我在想一些更自主的东西:) 所以对 fetchOrders 的调用将停止之前调用的任何东西。

switchMap 就是您要找的。它将取消之前的可观察值并发出新的值。

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