我已经配置了我的全局错误处理程序:
[{provide: ErrorHandler, useClass: GlobalErrorHandler}]
所以基本上如果发生错误,我会调用我的服务来调度操作,所以我会显示带有错误消息的材料小吃栏:
export class AppService {
constructor(store: Store<fromRoot.State>) { }
public push(message: string, action?: string, config?: MdSnackBarConfig) {
const alert: AppAlert = { message: message, action: action, config: config };
this.store.dispatch(new appAlert.DisplayAppAlertAction(alert));
}
}
问题是,无论我handleError()
在商店中发送什么,都没有得到更新。
export class GlobalErrorHandler extends ErrorHandler {
/** */
handleError(error: any): void {
this.appAlertService.push('Error here', 'OK', config); // not firing the reducer
}
}
我所有的调度员都在外面工作得很好,handleError()
但是当我检查调试时,这个调度员reducers
没有被调用。
基本上在错误handleError()
被调用然后dispatcher
被解雇但状态没有被改变的情况下,原因是因为在这种情况下没有调用reducer。但是,如果我从AppService
任何组件或外部任何其他地方调用相同的服务 (),那一切都很好handleError()
。
另外,我只是将整体照亮Store
,GlobalErrorHandler
而不是使用 myAppService
来查看它是否有任何区别,但结果只是通过dispatching
直接形式的操作获得了相同的结果handleError()
-reducer
仍然没有被调用。
任何想法为什么?
更新
我的服务实际上是被调用的,基本上就像@olsn建议的那样,我也添加.catch
了:
@Effect()
search$: Observable<Action> = this.actions$
.ofType(stuff.LOAD)
.mergeMap(() =>
this.myService.getStuff()
.map((stuff: Stuff[]) =>
new stuff.LoadSuccessAction(stuff)
)
.catch((): any => {
throw new HttpError();
})
).catch((): any => {
throw new HttpError();
});
但是并没有帮助两个.catch()
块在抛出错误时首先被调用。但是,当单击任何buttons/routes
以继续时,handleError()
我的调度仍然无法正常工作。