Angular2:使用 http 的服务 - 处理错误(在 200 响应中)
Angular2: Service with http - handling errors (in 200 response)
所以我有一个服务可以执行一些 http API 调用...
我在网上找到的所有示例都假定返回的 JSON 有效...
我想做的是触发与 http
中的 catch 块相同的调用
所以
getData(id: string): Observable<someEntity>{
return this.http.get(someUrl)
.map(this.handleResponse.bind(this))
.catch(this.handleError);
}
private handleResponse(res: Response){
if(res.status === 200){
let body = res.text();
if(!this.appService.IsJsonString(body)){
return this.handleError(new Error('The response is not valid JSON '));
}else{
return res.json() || {};
}
}
}
private handleError (error: any) {
this.appService.errorAdd(error.status, error.statusText, 'Error loading Index data', ErrorTypes.Data);
let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error';
return Observable.throw(errMsg);
}
当我在组件中执行时:
this.myService.getData(someID)
.subscribe(
data => {...},
error => {
// LOGIC HERE
}
);
我希望这两个错误都由 // LOGIC HERE(错误块)处理......而不是一个在成功块中,另一个在错误中
我做错了什么?
如下更改handleResponse
即可满足您的要求。
private handleResponse(res: Response){
if(res.status === 200){
let body = res.text();
if(!this.appService.IsJsonString(body)){
// Throw, instead of return
throw 'The response is not valid JSON';
}else{
return res.json() || {};
}
}
}
也可以去掉private handleError
getData(id: string): Observable<someEntity>{
return this.http.get(someUrl)
.map(this.handleResponse.bind(this));
// Don't catch here
// Let the subscription error block to handle error throw
// .catch(this.handleError);
}
如果你想在组件中隐藏 RxJs 对象
改变 getData() 的调用方式
getData(
id: string,
callback: (result: any) => void,
errorHandler) {
this.http.get(someUrl)
.map(this.handleResponse.bind(this))
.subscribe(r => callback(r), e=>errorHandler);
}
在组件中
this.myService.getData(
someID,
data => {...},
error => {
// LOGIC HERE
}
);
所以我有一个服务可以执行一些 http API 调用...
我在网上找到的所有示例都假定返回的 JSON 有效...
我想做的是触发与 http
中的 catch 块相同的调用所以
getData(id: string): Observable<someEntity>{
return this.http.get(someUrl)
.map(this.handleResponse.bind(this))
.catch(this.handleError);
}
private handleResponse(res: Response){
if(res.status === 200){
let body = res.text();
if(!this.appService.IsJsonString(body)){
return this.handleError(new Error('The response is not valid JSON '));
}else{
return res.json() || {};
}
}
}
private handleError (error: any) {
this.appService.errorAdd(error.status, error.statusText, 'Error loading Index data', ErrorTypes.Data);
let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error';
return Observable.throw(errMsg);
}
当我在组件中执行时:
this.myService.getData(someID)
.subscribe(
data => {...},
error => {
// LOGIC HERE
}
);
我希望这两个错误都由 // LOGIC HERE(错误块)处理......而不是一个在成功块中,另一个在错误中
我做错了什么?
如下更改handleResponse
即可满足您的要求。
private handleResponse(res: Response){
if(res.status === 200){
let body = res.text();
if(!this.appService.IsJsonString(body)){
// Throw, instead of return
throw 'The response is not valid JSON';
}else{
return res.json() || {};
}
}
}
也可以去掉private handleError
getData(id: string): Observable<someEntity>{
return this.http.get(someUrl)
.map(this.handleResponse.bind(this));
// Don't catch here
// Let the subscription error block to handle error throw
// .catch(this.handleError);
}
如果你想在组件中隐藏 RxJs 对象
改变 getData() 的调用方式
getData(
id: string,
callback: (result: any) => void,
errorHandler) {
this.http.get(someUrl)
.map(this.handleResponse.bind(this))
.subscribe(r => callback(r), e=>errorHandler);
}
在组件中
this.myService.getData(
someID,
data => {...},
error => {
// LOGIC HERE
}
);