【问题标题】:How to cancel epic to avoid multiple instances如何取消史诗以避免多个实例
【发布时间】:2018-09-14 15:24:51
【问题描述】:

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

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

其中ordersReceived 是一个动作创建器,旨在与paylod 一起运行,mockOrders 返回一些模拟的payload。

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

编辑 我在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代替mergeMap吗?

标签: rxjs redux-observable rxjs6


【解决方案1】:

switchMap 是您正在寻找的。它将取消之前的 observable 并发出新的 observable 的值。

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

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多