Javascript 如何确保Observable.map仅在成功时执行?
我只想确保Javascript 如何确保Observable.map仅在成功时执行?,javascript,angular,Javascript,Angular,我只想确保map函数中的代码只能在成功时调用,而不能在失败时调用 delete(department: Department): Observable<Department[]> { return this.post('/delete', body).map(response => { let index: number = this.departments.indexOf(department); if (index > -1
map
函数中的代码只能在成功时调用,而不能在失败时调用
delete(department: Department): Observable<Department[]> {
return this.post('/delete', body).map(response => {
let index: number = this.departments.indexOf(department);
if (index > -1) {
this.departments.splice(index, 1);
}
return this.departments;
});
}
删除(部门:部门):可观察{
返回此.post('/delete',body).map(响应=>{
让索引:number=this.departments.indexOf(department);
如果(索引>-1){
本节介绍了部门拼接(索引1);
}
将此文件退还给各部门;
});
}
我不知道map
中的代码是否只在成功时执行。而且,我必须返回一个可观察的
,因此,我不能在这里应用订阅
功能。可观察的#map
操作符将仅在成功响应时执行(例如状态200)<代码>可观察#捕捉操作员旨在捕捉故障
此外,Observable#catch
操作符还将捕获映射成功响应时抛出的javascript错误。例如:
fetchDashboardData(): Observable<Dashboard> {
return this._http.get(reqUrl, reqOptions)
.map((response: Response) => new Dashboard(response.json().items[0].dashboard))
.catch((error: any) => {
if (error instanceof Error) {
// js error, e.g. response.json().items was an empty array
console.log(error); // => “Cannot read property 'dashboard' of undefined...
return Observable.throw('Incomplete response data!');
} else {
return Observable.throw('Server error!');
}
});
}
回答得好。作为附加信息,subscribe中的第二个参数是可以使用error函数的地方。所以..删除(部门).订阅((成功)=>success,(错误)=>error,(complete)=>complete)所以必须捕获,对吗?因此我可以将错误重定向到subscribe调用。Observable#subscribe方法接受3个回调:…subscribe(onSuccess,onError,finallyFn);所以,若响应成功,并且映射在无错误的情况下传递,则将调用onSuccess,否则将使用“JavaScript error Occessed!”调用onError或“服务器错误!”这里我所说的失败是指服务器错误。您抛出一个自定义错误,但我想抛出返回的实际错误
.catch((error:any)=>{return Observable.throw(error)}
@Avinash Raj如果你想处理错误,那么是的,这是必须的。AFAIK,像maps
这样的操作符是用来转换流中的数据的,而不是用来处理流的结果。另外,“失败”到底是什么意思?如果在一个所谓的“失败”之后仍然获得一个响应
,也许您可以对其进行分析(即测试响应.状态
,响应.标题
),以决定是否值得继续。如果失败意味着较低级别的错误(即异常),那么您可以使用类似.catch()
的操作符来处理它们。
this.dashboardService.fetchDashboardData().subscribe(
(dashboard: Dashboard) => {
this.dashboard = dashboard;
console.log('Success fetching dashboard data!', dashboard);
},
(errMssg: string) => {
console.error(errMssg); // => 'Incomplete response data!'
// or 'Server error!'
},
() => {
// finally block!
}
);