Angular2和rxjs'Catch'运算符无法正常工作

时间:2017-03-21 09:27:52

标签: angular rxjs observable

Plnkr Link With Working Code

我正在尝试将工作代码从Plnkr复制到我的机器上,并且它在VisualStudio中显示错误。

目前我正在使用@angular "^2.4.5"rxjs "^5.2.0"

enter image description here

错误是说

  

类型的参数'(错误:任何)=> void'不能赋值给'参数'(错误:任何,被捕获:可观察)=> ObservableInput< {}>”

您可以在我的以下脚本中看到我复制的内容与Plnkr代码完全相似,并导入了'catch'操作符。但是,它不起作用并在getStudentCourse2()方法中显示上述错误。

如果我删除了catch操作符并更改了getStudentCourse()方法中的代码,那么它可以工作,我可以看到结果。

student.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/of';

@Injectable()
export class StudentService {
    private http: Http;            

    constructor(http: Http) {
        this.http = http;        
    }

    getStudentCourse(): Observable<IStudentCourse> {

        return this.http.get('/api/student/getstudentcourse').map(result => {
            return result.json() as IStudentCourse;
        }, error => console.log('Could not load data in service.'));

    }

    getStudentCourse2(): Observable<IStudentCourse> {

        return this.http.get('https://58cff77fe1a0d412002e446d.mockapi.io/api/student/getstudentcourse/2').map(result => {
            return result.json() as IStudentCourse;
        }).catch(error => console.log('Could not load data in service.'));

    }
}

export interface IStudentCourse {
    refNo: string;
    student: string;
    offeringName: string;
    offeringID: number;
}

我无法找出为什么'Catch'运算符在我的代码中不起作用'Plnkr'。你能帮我解决这个问题吗?感谢。

4 个答案:

答案 0 :(得分:2)

catch运算符需要返回Observable,但由于void始终返回console.log,您将返回void。返回Observable,错误就会消失。

例如:

...
.catch(error => {
  console.log('something went wrong');
  return Observable.throw(new Error('throw a fancy new error'));
})

答案 1 :(得分:2)

错误就是这样说; catch运算符中的回调不返回任何内容。您可以在catch运算符中抛出错误并在订阅时处理此错误;

getStudentCourse(){
     return this.http.get(parameters).map(handleData).catch(error => {
          Observable.throw(error);
     });
}

getStudentCourse().subscribe(successCallback, (error) => {
     // do whatever you want with this error
});

答案 2 :(得分:2)

catch需要返回Observablethrow内容。当您返回一个observable时,它将在您的订阅中输入成功方法。扔东西时会输入错误方法。检查我给你上一个问题的答案。 this plunker

答案 3 :(得分:1)

你的问题来自于catch方法必须返回一个Observable,但是你的代码并没有真正返回一个Observable。

您可以使用以下代码轻松解决问题:

return this.http.get('https://58cff77fe1a0d412002e446d.mockapi.io/api/student/getstudentcourse/2').map(result => {
                return result.json() as IStudentCourse;
            },
            error => this._exceptionService.HandleError(error));
)

但是,我建议另一种解决这个问题的模式,实际上会让你的代码在我看来更清晰。

您可以使用HandlException方法轻松创建ExceptionService(例如),而不是使用.catch方法,只需将错误传递给该方法并在那里处理错误。

您的代码看起来像这样:

{{1}}

(已经说过在组件中注入了_exceptionService)

通过这种方式处理,您的代码变得更加清晰。