javascript - 循环依赖,当 ovveriding ExceptionHandler

标签 javascript angularjs dependency-injection typescript angular

<分区>

我有这个代码:

import {Injectable, ExceptionHandler, SkipSelf, Host, Optional} from     '@angular/core';
import {ToastNotification} from '../toast-messages/toastNotification.service';

export class UIError extends Error {
    constructor (private toastMessage: string) {
        super();
        this.toastMessage = toastMessage;
    }
}

export class MyUIError extends UIError {}
export class AnotherError extends UIError {}

export class _ArrayLogger {
    res = [];
    log(s: any): void { this.res.push(s); }
    logError(s: any): void { this.res.push(s); }
    logGroup(s: any): void { this.res.push(s); }
    logGroupEnd() {};
}

export class ConsoleLogger {
    log(s: any): void {console.log(s);}
}

@Injectable()
export class CustomExceptionHandler extends ExceptionHandler {
    constructor(private logger: ConsoleLogger, private toast: ToastNotification) {
        super (new _ArrayLogger(), true);
    }

    call(exception: any, stackTrace = null, reason = null) {
        let self = this;
        if (exception.originalException instanceof UIError) {
            self.toast.Error(exception.originalException.toastMessage);
        } else {
            this.logger.log(exception);
        }
    }
}

当我尝试运行它时,我遇到了 toast 问题:ToastNotification。我得到的错误是:

zone.js:260Uncaught EXCEPTION: Error during instantiation of ApplicationRef_! (ApplicationRef -> ApplicationRef_).
ORIGINAL EXCEPTION: Cannot instantiate cyclic dependency! (ExceptionHandler -> ToastNotification)
ORIGINAL STACKTRACE:
Error: DI Exception
    at CyclicDependencyError.BaseException

我也在 boostrap 中注入(inject)了这个组件。如何解决?

最佳答案

在构造函数中使用注入(inject)器时,我仍然遇到同样的问题。为我解决的是将注入(inject)部分移至调用函数。

@Injectable()
export class AppExceptionHandler extends ExceptionHandler {
  private router:Router;
  private toaster:ToastsManager;

  constructor(private injector: Injector) {
    super(new _ArrayLogger(), true);
  }

  call(exception:any, stackTrace?:any, reason?:string):void {
    this.getDependencies();
    console.log(exception);

    if(exception.status === 401){
      // Show login
      this.router.navigate(['/login']);
    }

    // Get error messages if http exception
    let msgs = [];
    if(exception instanceof Response){
      msgs = this.getMessagesFromResponse(exception);
    }else{

      // Otherwise show generic error
      msgs.push('Something went wrong');
    }

    // Show messages
    msgs.forEach((msg) => this.toaster.error(msg));

    super.call(exception, stackTrace, reason);
  }

  private getDependencies(){
    if(!this.router){
      this.router = this.injector.get(Router);
    }
    if(!this.toaster){
      this.toaster = this.injector.get(ToastsManager);
    }
  }

}

关于javascript - 循环依赖,当 ovveriding ExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37592078/

相关文章:

angular - 为什么我应该在简单的对象配置上使用 Angular 的依赖注入(inject)?

c# - WCF、依赖注入(inject)和序列化

architecture - 在解析公共(public)类时注入(inject)内部帮助类

javascript - Angular JS 重复无序列表中的 2 个数组

javascript - 服务中的数组上的$watch在指令中不起作用

javascript - 在Functions.php中的wordpress中加载自定义JS后504网关超时

javascript - 页面点击其他路径后 $timeout 继续运行

javascript - 在 Javascript 中获取整个 html 文档中节点的偏移量?

javascript - 提交时清除输入字段

javascript - Angular ui sref 不适用于触摸事件