Redux-observable:当动作完成时组件如何订阅响应?
Posted
技术标签:
【中文标题】Redux-observable:当动作完成时组件如何订阅响应?【英文标题】:Redux-observable: how a component can subscribe to react when action is completed? 【发布时间】:2021-01-11 14:29:45 【问题描述】:假设这个演示代码:
const pingEpic = action$ => action$.pipe(
filter(action => action.type === 'PING'),
delay(1000), // Asynchronously wait 1000ms then continue
mapTo( type: 'PONG' )
);
// later...
dispatch( type: 'PING' );
const pingReducer = (state = , action) =>
switch (action.type)
case 'PING':
return state;
case 'PONG':
return state;
default:
return state;
;
在一个特定的组件中,假设与调度 PING 或 PONG 无关,也不使用任何 redux 状态,我想以某种方式订阅操作生命周期以及 PONG 操作何时完成(即已被减速器处理) 它执行一个回调。比如:
const myComponent = () =>
ofActionSuccessful('PONG').subscribe( () => console.log('PONG has just completed'));
类似:https://www.ngxs.io/advanced/action-handlers
我怎样才能做到这一点?
我不想在reducer中链接一些逻辑,因为它是与那个组件严格相关的东西,与store无关。
【问题讨论】:
【参考方案1】:来自redux-observable docs:
在 reducer 已经接收到 Epic 之后,Epic 与正常的 Redux 调度通道一起运行——因此你不能“吞下”传入的操作。动作总是在您的 Epic 收到它们之前通过您的减速器。
所以我们可以使用史诗来获得“PONG”信号。
const allActions$ = new Subject();
// This must be merged into your root epic.
export const tapAllActions = (action$) =>
action$.pipe(tap(allActions$), concatMapTo(EMPTY));
export const ofActionSuccessful = (actionType) =>
allActions$.pipe(filter(( type ) => type === actionType));
【讨论】:
以上是关于Redux-observable:当动作完成时组件如何订阅响应?的主要内容,如果未能解决你的问题,请参考以下文章
如何在ngrx/effect(redux-observable)中调度多个动作?
在 catchError 之后不会执行 redux-observable
在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?
从 redux-observable 的史诗有条件地调度额外的动作
如何从 typesafe redux-observable epic 中收听“@@router/LOCATION_CHANGE”动作