使用Injector.get()时出现一个服务抛出异常

时间:2017-07-24 12:09:25

标签: angular

我有一个发出http请求的服务。我们考虑一种方法:

export class JsonApiService {
 constructor(private http: Http, private localStorageService: LocalStorageService) { }

      public get(url, params?, requestOptions: any = {}): Observable<any> {        
        const options = this.buildRequestOptions(requestOptions);
        const fullUrl = this.buildUrl(url);
        const urlWithQuery = this.addQueryParams(fullUrl, params);
        return this.http.get(urlWithQuery, options)         
          .map(this.extractData)
          .catch((e) => this.handleError(e));
      }
}

你可以看到我使用catch来缓存错误。这是handleError函数:

private handleError(error: any): Observable<any> {
    let body  = error.json ? error.json() : '';
    if (!environment.production) {
      console.warn(error);
    }
    this.onError.next(body);       
    if(error.status === 0) {
      body.message = 'Can\'t connect to the server.';
    }

    return Observable.throw(body);
  }

此任务的标准代码。现在,我需要处理一个特定的服务器错误响应。特定错误json包含一个字段checkIntegration。所以,我想检查错误,如果它包含这个字段。如果是,那么做一些自定义逻辑。我不想把这个逻辑放到JsonApiService本身,因为我想从项目到项目重用这个服务,而实际上我是这样做的。我一直在使用它进行最后3个项目而没有任何修改。

所以,我编写了自定义错误处理程序:

export class ErrorHandlerService extends ErrorHandler {
  constructor(private injector: Injector) {
    super(true);

    let jsonApiService = this.injector.get(JsonApiService);
    jsonApiService.onError.subscribe((err) => {
      this.handleError(err);
    })
  }

  ...
}

如您所见,我使用onError。它只是Subject。 但是,我在应用程序启动时遇到错误: Cannot read property 'notifyOptions' of undefined ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'notifyOptions' of undefined at new LocalStorageService (local-storage.service.js:34)

错误在local-storage.service内引发。这不是我的服务,但我将此服务注入JsonApiService。我相信当我在处理程序中使用注入器时,不会创建所有服务。有什么想法吗?

PS。我使用以下库进行本地存储: https://github.com/phenomnomnominal/angular-2-local-storage/blob/master/src/local-storage.service.ts#L38

1 个答案:

答案 0 :(得分:1)

上面的代码LocalStorageService可能没有正确配置,因为所述属性originates in configuration provider

JsonApiService实例化时抛出错误,它将阻止提供程序正常运行。使用onError处理错误毫无意义,因为错误在handleError之前很久就会被抛出。

它应该在问题提供者实例化的地方被捕获:

export class JsonApiService {
 private localStorageService?: LocalStorageService;
 constructor(private http: Http, private injector: Injector) { }
   try {
     this.localStorageService = injector.get(LocalStorageService);
   } catch (err) {
     ...
   }

但正确的解决办法是首先解决问题的原因。