我正在尝试将工作代码从Plnkr复制到我的机器上,并且它在VisualStudio中显示错误。
目前我正在使用@angular "^2.4.5"
和rxjs "^5.2.0"
错误是说
类型的参数'(错误:任何)=> 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'。你能帮我解决这个问题吗?感谢。
答案 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
需要返回Observable
或throw
内容。当您返回一个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)
通过这种方式处理,您的代码变得更加清晰。