2017-08-21 3 views
0

Ich versuche, den Fehlertyp zu überprüfen, der vom Webdienst zurückgegeben wird. Das Problem ist, dass instanceof Überprüfung nicht funktioniert. Keines der if funktioniert.Angular & TypeScript: Klasseninstanzüberprüfung funktioniert nicht

Komponentenklassenmethode, die den Anruf zu WS löst:

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 Klasse, die die Basisdienstklasse erweitert:

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 Klasse

export class AppError { 
    constructor(public originalError?: any) { 
    } 
} 

Und der Rest der Fehlerklassen erweitern es einfach, zB:

export class AccessDeniedError extends AppError { 
} 

Wenn ich versuche, die error von AppError ich dies in der Konsole anzumelden, was sehr seltsam ist:

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) 
+0

sollten Sie Fehlermeldungen lesen ... Sie sind nützlich – smnbbrv

+0

@smnbbrv Sie sind sehr freundlich;) –

+0

: D gut, das war Wahrheit sowieso :) – smnbbrv

Antwort

2

Als Fehlermeldung sagt, der Fehler keine der oben genannten ist aber TypeError und Es liegt daran, dass es keine Observable.throw Methode gibt.

Es sei denn, das gesamte RxJS Paket mit import 'rxjs/Rx' importiert wurde, sollte throw explizit importiert werden, wie jeder andere RxJS Operator oder beobachtbaren Methode:

import 'rxjs/add/observable/throw'; 

Diese Art von Fehler soll bei Typoskript Kompilierung erkannt werden, so Es wäre nicht nötig, sie zur Laufzeit zu debuggen.

+0

Ich hatte 'importieren {Observable} von" rxjs/Observable ";' und dachte, es sei ausreichend, aber ich denke, ich lag falsch :) Danke, es funktioniert jetzt großartig! –

+1

Gern geschehen. Es könnte möglicherweise genug sein, wenn sie irgendwo anders importiert werden (oft ist es das), aber diese Art von Bedingungen sollten nicht verlässlich sein, es ist eine gute Sache, sie jedes Mal zu importieren, wenn Sie sie benutzen - oder Sie können sie einmal in 'polifills.ts importieren 'oder anderes allgemeines Modul. – estus

+0

Danke! Diese Art von Ratschlägen sind sehr nützlich. –

Verwandte Themen