如何取消史诗以避免多个实例
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()))
))
);
};
我有以下史诗(顺便说一句。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()))
))
);
};