2017-03-08 10 views
1

Ich verwende Angular 2 HTTP und habe eine Komponente, die die Antwort abonniert. Tritt jedoch ein Fehler auf, gibt die Fangmethode den Fehler nicht an die abonnierte Komponente zurück. Es wirft es einfach in die Konsole.Angular 2-Fehlerbehandlung - An abonnierte Komponente senden

saveFinalize(fcData: LastForecastInterface) { 
 
    let responseData = JSON.stringify(fcData); 
 
    let body = responseData; 
 

 
    const headers = new Headers(); 
 
    headers.append('Content-Type', 'application/json;charset=UTF-8'); 
 

 
    return this.http.post('/saveFinalize', body, { headers: headers }) 
 
     .map((data: Response) => data.json()) 
 
     .catch(this.handleError); 
 
} 
 

 
public handleError(error: Response | any) { 
 
    console.log('err: ', error) 
 
    let errMsg: string; 
 
    if (error instanceof Response) { 
 
     const body = error.json() || ''; 
 
     const err = body.error || JSON.stringify(body); 
 
     errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
 
    } else { 
 
     errMsg = error.message ? error.message : error.toString(); 
 
    } 
 
    console.error(errMsg); 
 
    // return Observable.throw(errMsg); 
 
    return errMsg; 
 
}

Und meine abonnierten Komponente erhält keine Antwort

saveFinalize() { 
 
    this.loadingData = true; 
 
    return this.httpService.saveFinalize(this.getFc.fcData) 
 
    .subscribe(response => { 
 
     this.loadingData = false; 
 
     console.log(response); 
 
     let saveResponse = response.success ? 'Successfully Saved Finalized!' : 'Error Saving Finalized! - ' + response.message; 
 
     let respType = response.success ? 'success' : 'danger'; 
 
     this.alertSvc.showAlert(saveResponse, respType); 
 
    }); 
 
}
zurück

+0

Die 'handleError'-Funktion muss ein' Observable' zurückgeben, damit 'catch' funktioniert. Sehen Sie diesen Link: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catch.md – eminlala

Antwort

7

diesen Code Siehe hier: (Es ist von https://angular.io/docs/ts/latest/guide/server-communication.html)

getHeroes() { 
    this.heroService.getHeroes() 
        .subscribe(
        heroes => this.heroes = heroes, 
        error => this.errorMessage = <any>error); 
} 

Hinweis gibt zwei Argumente für .subscribe() -Methode sind. Eine ist die Antwort, die Sie verwenden, und die nächste ist der Fehler. Um den Fehler zu der gezeichneten Komponente zu übergeben Sie das späte Argument verwenden müssen, die Ihr Code wie folgt aussieht machen:

return this.httpService.saveFinalize(this.getFc.fcData).subscribe(response => { 
    this.loadingData = false; 
    console.log(response); 
    let saveResponse = response.success ? 'Successfully Saved Finalized!' : 'Error Saving Finalized! - ' + response.message; 
    let respType = response.success ? 'success' : 'danger'; 
    this.alertSvc.showAlert(saveResponse, respType); 
    }, error => { 
    // the errorMessage will be passed here in this "error" variable 
    }); 

Wenn die gezeichnete Methode eine erfolgreiche Antwort zurückgibt, werden Sie nur Ihre Antwort. Wenn die subskribierte Methode jedoch einen Fehler ausgibt, erhalten Sie keine Antwort, sondern nur den Fehler (das zweite Argument der Methode subscribe()).

Sie müssen den Fehler auch von der Methode handleError() auslösen. Statt also nur den Zeichenfolgenwert (return errMsg;) zurückzugeben, sollten Sie return Observable.throw(errMsg); verwenden.

+1

Das hat funktioniert! Vielen Dank! – ahrobins

+0

@ahrobins Ich bin froh, dass ich helfen kann :) – samAlvin

0

Sie

tun können
.catch((response: Response) => { 
       return Observable.of(response); 
      }); 

, die die Antwort für Sie zurückgibt.

+0

Das hat nicht für mich funktioniert, aber die Antwort oben von samAlvin tat. Vielen Dank für die schnelle Antwort. – ahrobins

Verwandte Themen