2017-03-08 9 views
1

私はAngular 2 HTTPを使用しており、コンポーネントは応答を購読しています。ただし、エラーが発生した場合、catchメソッドはエラーをサブスクライブされたコンポーネントに返しません。それは単にコンソールにスローされます。角度2エラー処理 - 購読したコンポーネントに送信

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; 
 
}
そして、私の加入したコンポーネントは、あなたが行うことができます

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); 
 
    }); 
 
}

+0

'handleError'関数は' catch'を動作させるために 'Observable'を返す必要があります。このリンクを参照してください:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catch.md – eminlala

答えて

7

は、ここで、このコードを参照してください。(それはhttps://angular.io/docs/ts/latest/guide/server-communication.htmlからである)

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

お知らせ.subscribe()メソッドの2つの引数があります。 1つは使用している応答で、次はエラーです。あなたのコードは次のように見えるようになり、後に引数を使用する必要がありますサブスクライブコンポーネントにエラーを渡すために:サブスクライブされたメソッドが正常な応答を返すとき

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 
    }); 

、あなただけのあなたの応答を取得します。しかし、サブスクライブされたメソッドがエラーをスローすると、レスポンスを得ることはできません。これはエラー(subscribe()メソッドの第2引数)だけです。

また、handleError()メソッドからエラーをスローする必要があります。そのため、文字列値(0​​)のみを返す代わりに、return Observable.throw(errMsg);を使用してください。

+1

それは働いた!本当にありがとう! – ahrobins

+0

@ahrobins私は助けになることがうれしいです:) – samAlvin

0

応答を取り戻すしない

.catch((response: Response) => { 
       return Observable.of(response); 
      }); 

あなたのために応答を返します。

+0

これは私のためには機能しませんでしたが、上記のsamAlvinの答えがありました。しかし、迅速な対応のためにありがとうございます。 – ahrobins

関連する問題