2017-03-08 56 views
1

我正在使用Angular 2 HTTP,並且有一個訂閱響應的組件。但是,當出現錯誤時,catch方法不會將錯誤返回給訂閱的組件。它只是把它扔進控制檯。Angular 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); 
} 

通知有2個參數爲.subscribe()方法。一個是你使用的響應,另一個是錯誤。爲了將錯誤傳給你必須使用論證後訂閱的組成部分,這將使你的代碼如下所示:

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()方法的第二個參數)。

您還需要從handleError()方法拋出錯誤。因此,而不是隻返回字符串值(return errMsg;),您應該使用return Observable.throw(errMsg);

+1

工作正常!非常感謝! – ahrobins

+0

@ahrobins我很高興能有所幫助:) – samAlvin

0

你可以做

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

這將爲您返回響應。

+0

這不適合我,但從samAlvin上面的答案。但是,謝謝你的快速回應。 – ahrobins