用例:调度一个在有效负载中具有冷可观察性的操作
当一个效果捕捉到该动作时,它会订阅(通过mergeMap、switchMap等(该可观察到的内容,并发回另一个动作。经典的Ngrx流程。
export class ServicesStore {
dispatchObservable(operation$: Observable<unknown>) {
this.store.dispatch(serviceRequestAction({ operation$ }));
}
}
export class ServicesEffects {
serviceRequest$ = createEffect(() =>
this.actions$.pipe(
ofType(serviceRequestAction),
mergeMap((action: ServiceRequestAction) => {
return action.operation$.pipe(
map((result) => {
// send back an action with the result
})
);
})
)
);
}
用法:
this.servicesStore.dispatch(this.userService.getAll$());
它运行良好。
但如果这个可观察到的是一个主题(比如MatDialog.open().afterClosed()
(,它将打破不可变操作Ngrx规则。由于内部订阅,Subject在其内部结构中添加了一个观察者,从而打破了动作不变性。然后它会触发Ngrx运行时检查。
当然我可以禁用这些检查,但我正在寻找一个更好的方法。例如,是否有克隆Subject的方法
或者以任何其他方式允许Subject进入操作负载?
AFAIK不支持向NgRx操作添加主题(如果您想保持启用运行时检查(。经典的NgRx过程是,效果会导致一个新的动作(流行的是成功和失败(。