【发布时间】:2019-11-14 06:56:42
【问题描述】:
我想以两种方式处理 NGXS 中的错误。第一种方法是在组件中处理 store dispatch 的错误。第二种方式是全局角度错误处理程序,作为未处理错误(第一种方式未处理)时的后备。
但问题是,当动作处理程序出现错误时,NGRX 总是调用全局错误处理程序。
所以在组件中给出这段代码:
this.store.dispatch(new FetchAction())
.subscribe( error: () => console.log('fetch error occured'))
这个动作处理程序:
fetch() {
return this.http.get('..');
}
还有这个全局错误处理程序:
export class GlobalErrorHandler extends ErrorHandler {
handleError(err: any) {
console.log('unexpected error occured');
}
}
控制台中会有两条错误消息。一个来自调度的订阅,另一个来自全局错误处理程序,因为操作处理程序中存在错误。
现在我可以在动作处理程序中捕获错误,但这样做是错误的,因为动作处理程序不应该知道该动作的错误是在组件中处理的。
我做了一个堆栈闪电战,当单击按钮时在控制台中显示两个错误:https://stackblitz.com/edit/ngxs-error-throw-r42fkb?file=src/app/app.component.ts
【问题讨论】:
-
您好,我推荐您学习 Angular 拦截器:scotch.io/@vigneshsithirai/…
-
我确实知道 http 拦截器,但这不是解决方案。 http拦截器仍然必须返回结果。您显然无法在此处捕获错误并告诉应用程序响应成功并返回一些值(甚至会是什么?),而实际上它根本不成功。它仅在没有全局错误处理程序时才有效。但是应该一直支持全局错误处理程序,因为它是 angular 的一个组成部分
-
创建了一个新的堆栈闪电战,重现了该问题:stackblitz.com/edit/…希望有人能提供帮助。
-
您找到解决方案了吗?我也有同样的问题。