angular - 如何处理 API 服务中的 HTTP 错误并仅在成功的情况下通过 Observable 返回响应?
问题描述
在我的 Angular2 应用程序中,我有一个带有sendRequest方法的api.service ,它应该执行以下操作:
- 向服务器发送请求
- 向调用者返回承诺(我希望调用者只获得成功响应)
- 如果发生错误,请在本地处理错误(导航用户登录或显示弹出窗口)
我使用 Promise 实现了它:
sendRequest(method: string, url: string, data: any) : Promise<any> {
return this.http.request(method, url, {
body: data,
headers: {
'Accept': 'application/json, text/plain, */*',
'Authorization': 'bearer ' + token,
'Content-Type': 'application/json;charset=UTF-8'
}
}).toPromise().catch((res) => this.handleError(res));
}
handleError(response: any) {
if (response.status === 401 || response.status === 403) {
this.tokenService.deleteToken();
this.router.navigate(['login']);
}
// Show popup etc.
...
}
我想用 observable 替换 promise:
sendRequest(method: string, url: string, data: any) : Observable<any> {...}
请告知如何做到这一点。谢谢你。
编辑 1:我找到了处理响应的示例,然后将一些结果传递给观察者。那不是我需要的。如果发生错误,则根本不应该通知观察者。仅当成功响应到达时才应通知观察者。如果发生错误,它应该只在api.service中处理。
解决方案
请看下面 -
sendRequest(method: string, url: string, data: any) : Observable<any>{
return this.http.request(method, url, {
body: data,
headers: {
'Accept': 'application/json, text/plain, */*',
'Authorization': 'bearer ' + token,
'Content-Type': 'application/json;charset=UTF-8'
}
}).map( ( res ) => {
return res || {};
} )
.catch( this.handleError );
}
handleError(response: any) {
if (response.status === 401 || response.status === 403) {
this.tokenService.deleteToken();
this.router.navigate(['login']);
}
// Show popup etc.
...
}
推荐阅读
- node.js - 如何将 json 中的图像渲染到图像文件 url
- google-sheets - 条件格式谷歌表,匹配两个日期之间的日期 - 标记匹配的行
- r - R循环并使用行绑定追加
- vue.js - Vuejs使用vuex数据为v-for中的组件设置反应式样式
- python - Kivy - 导航抽屉没有出现
- flutter - 有没有简单的方法可以让列表变得很深?
- google-chrome - 在 Chrome 扩展程序中将 optional_permission 移动到所需权限
- python - 从 pygame-menu 选择器 onreturn 更改游戏属性
- flutter - 如何在 SliverAppBar 中为项目的位置设置动画以在关闭时围绕标题移动它们
- github - Git push 在另一个文件夹中创建我的项目文件夹,如何避免它?