2017-03-08 57 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