Angular 2 : Service with http - handling errors (in 200 response)

标签 angular angular2-services angular2-http

所以我有一个服务可以执行一些 http API 调用...

我在网上找到的所有示例都假设返回的 JSON 有效......

我想要做的是触发与http中的catch block 相同的调用

所以

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(错误 block )处理......而不是一个在成功 block 中,另一个在错误中

我做错了什么?

最佳答案

如下更改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
    }
);

关于 Angular 2 : Service with http - handling errors (in 200 response),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978818/

相关文章:

angular - 顶部导航栏中的导航按钮,带有 ionic-2-sidemenu 应用程序

css - 如何设置 Angular Material 选项卡的 mat-ink-bar 以获取选项卡标题文本宽度的宽度

angular - Angular2:Rollupjs捆绑与组件类中的相对路径

Angular 2 - 你会如何订阅多个变量?

javascript - angular2 http post 请求获取 res.json()

Angular 2 服务...毫无意义?

javascript - 如何使用 javascript 使用 angular 2 http post 函数提交表单?

Angular 2 : Child Routes not working by address bar

api - 取消/杀死 http api 调用 Angular 2

java - 在 Angular 2 中设置授权 header