【问题标题】:Why my global error handler get invoked twice in my Angular app?为什么我的全局错误处理程序在我的 Angular 应用程序中被调用两次?
【发布时间】:2018-06-02 13:05:23
【问题描述】:

我有这个简单的全局错误处理程序,它源于角度 ErrorHandler。现在无论错误的位置在哪里,初始处理都会进行两次,或者至少看起来是这样。我的控制台第一次记录了两次相同的错误,之后如果错误仍然存​​在,那么为什么会这样?

import { ErrorHandler, Injectable, Injector } from "@angular/core";
import { Router } from '@angular/router';
@Injectable()
export class ArtCoreErrorHandler implements ErrorHandler {

  constructor(private injector: Injector) { }

  handleError(error) {
    console.log(error)
    const message = error.message ? error.message : error.toString();
    if (message == 'JWT must have 3 parts') {
      router.navigate(['/']).then(
        () => alert('wrong'),
      );
      location.reload();
    }
    throw error;
  }
}

在我的app module

 providers: [
    {provide: ErrorHandler, useClass: ArtCoreErrorHandler},
    MDBSpinningPreloader,
.........]

【问题讨论】:

    标签: angular error-handling


    【解决方案1】:

    如果您的错误是由于 Observable 失败而引发的,例如通过 HttpClient 的 HTTP 请求失败,则可能是您订阅了 observable 两次。多次订阅会导致多次错误,即使源 observable 只抛出一次错误。

    在这个例子中:

    let obs = this._http.get('https://i-do-not-exist.test').pipe(share());
    obs.subscribe(() => {})
    obs.subscribe(() => {})
    

    HTTP 请求只会运行一次,但会抛出 2 个错误并被全局错误处理程序捕获。

    看到这个StackBlitz

    【讨论】:

    • 现在一切都说得通了
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2019-09-26
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2019-03-14
    • 2011-05-23
    相关资源
    最近更新 更多