我有一个发出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
答案 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) {
...
}
但正确的解决办法是首先解决问题的原因。