【问题标题】:Angular 2: http.get in Observable not handling errorAngular 2:Observable 中的 http.get 未处理错误
【发布时间】:2017-03-10 13:13:08
【问题描述】:

我正在使用 observables 进行 Http 调用,它一直运行良好,但后来我更改了我的控制器并注意到我的代码显然没有处理错误。

这是我的服务(SellingMenuService)中的代码:

public getVarieties(): Observable<any> {
    return this.http.get(this.varietyListUrl).map(response => {
        return response.json();
    }, (error: any) => {
        console.log(error);
        console.log('error finding variety list');
        // TODO: implement error handling here.
    });
}

这是我组件中的相关代码:

constructor(public sellingMenuService: SellingMenuService) { }

getVarietyList(): void {        
    this.sellingMenuService.getVarieties().subscribe(res => {            
        console.log(res);
        this.varieties = res;
    });         
}

以下是我的控制台中的一些错误:

如果我收到 500 错误,我上面的服务中的那些控制台日志不应该受到打击吗?为什么不呢?

【问题讨论】:

标签: angular angular2-http angular2-observables


【解决方案1】:

您的错误处理逻辑似乎包含在 map() 中。

import 'rxjs/add/operator/catch';

return this.http.request(request)
  .map(res => res.json())
  .subscribe(
    data => console.log(data),
    err => console.log(err),
    () => console.log('yay')
  );

见:How to catch exception correctly from http.request()?

【讨论】:

    【解决方案2】:

    您试图在map 方法中捕获错误,而您应该在subscribe 中进行。

    public getVarieties(): Observable<any> {
        return this.http.get(this.varietyListUrl).map(response => {
            return response.json();
        }).subscribe((res: any) => {
            console.log(res);
        }, (error: any) => {
            console.log(error);
            console.log('error finding variety list');
            // TODO: implement error handling here.
        });
    }
    

    你也可以给 observable 添加第三个参数。当 observable 为 finalized 时会解决:

    public getVarieties(): Observable<any> {
        return this.http.get(this.varietyListUrl).map(response => {
            return response.json();
        }).subscribe((res: any) => {
            console.log(res);
        }, (error: any) => {
            console.log(error);
            console.log('error finding variety list');
            // TODO: implement error handling here.
        }, () => {
            console.log("finalized")
        });
    }
    

    您可以在此处阅读更多内容: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html

    【讨论】:

    • 我尝试了您的代码并收到以下构建错误:类型“订阅”不可分配给类型“可观察的
    • 你能在 plunkr 中重现它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2014-10-29
    • 2017-11-25
    • 2016-08-20
    • 2018-04-23
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多