[英]Angular & TypeScript: Class instance check doesn't work
我正在嘗試檢查從Web服務返回的錯誤類型。 問題是instanceof
檢查不起作用。 if
沒有工作。
觸發對WS的調用的組件類方法:
public performSearch(keyword: string) {
this.searchService.searchWithQuery(keyword)
.subscribe(
response => {
this.searchResults = JSON.parse(response._body);
},
(error: AppError) => {
console.log('error instance');
console.log(error);
if (error instanceof NotFoundError) {
this.snackBar.open('404 Not Found', 'X', {
duration: 5000,
});
}
if (error instanceof AccessDeniedError) {
this.snackBar.open('401 Access Denied', 'X', {
duration: 5000,
});
}
if (error instanceof BadInputError) {
this.snackBar.open('400 Bad Input', 'X', {
duration: 5000,
});
}
if (error instanceof AppError) {
this.snackBar.open('General Error', 'X', {
duration: 5000,
});
}
});
}
擴展基本服務類的search.data.service類:
searchWithQuery(query: string) {
let headers = new Headers();
headers.append('Authorization', 'Bearer ' + this.tokenValue);
return this.http.get(this.gatewayUrl + this.serviceName + this.withQuery + query, {
headers: headers
})
.catch(this.handleError);
}
private handleError(error: Response): ErrorObservable {
if (error.status === 404)
return Observable.throw(new NotFoundError(error.json()));
if (error.status === 400)
return Observable.throw(new BadInputError(error.json()));
if (error.status === 401) {
return Observable.throw(new AccessDeniedError(error.json()));
}
return Observable.throw(new AppError(error.json()));
}
AppError.ts類
export class AppError {
constructor(public originalError?: any) {
}
}
其余的錯誤類僅對其進行擴展,例如:
export class AccessDeniedError extends AppError {
}
當我嘗試記錄AppError
的error
,我在控制台中得到了這個,這很奇怪:
TypeError: __WEBPACK_IMPORTED_MODULE_2_rxjs_Observable__.Observable.throw is not a function
at CatchSubscriber.webpackJsonp.../../../../../src/app/common/services/search.data.service.ts.SearchDataService.handleError [as selector] (search.data.service.ts:52)
at CatchSubscriber.webpackJsonp.../../../../rxjs/operator/catch.js.CatchSubscriber.error (catch.js:104)
at XMLHttpRequest.onLoad (http.es5.js:1231)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
at Object.onInvokeTask (core.es5.js:3881)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:191)
at ZoneTask.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:498)
at invokeTask (zone.js:1370)
at XMLHttpRequest.globalZoneAwareCallback (zone.js:1388)
如錯誤消息所述,該錯誤不是上述所有錯誤,而是TypeError
,這是由沒有Observable.throw
方法的事實引起的。
除非整個RxJS軟件包是通過import 'rxjs/Rx'
throw
應該像其他RxJS運算符或可觀察方法一樣顯式導入:
import 'rxjs/add/observable/throw';
應該在TypeScript編譯期間檢測到此類錯誤,因此無需在運行時對其進行調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.