Typescript Angular2:HTTP错误处理
我尝试在基于Angular2的Ionic2应用程序中,使用Angular1.x拦截器和promises成功实现以下行为:Typescript Angular2:HTTP错误处理,typescript,angular,rxjs,Typescript,Angular,Rxjs,我尝试在基于Angular2的Ionic2应用程序中,使用Angular1.x拦截器和promises成功实现以下行为: 拦截HTTP请求错误 如果状态代码为401,则 a。再次请求注册客户端。这将提供一些令牌,我可以随后附加到每个请求 b。重试原始请求,并通过promise/observable将结果提供给调用方 如果错误状态不是401,就让它正常地流向调用者 注意:注册过程不需要用户的任何干预(无需登录),因此我希望它对用户完全透明。我在第一次加载应用程序时注册了一次,但会话最终将过期,我需
responseError
部分):
现在,我已经包装了Angular2的HTTP服务,我可以做一些简单的事情,比如为每个请求添加一个头。然而,我正在努力使用Angular2和Observables重现同样的行为
到目前为止,这是我的服务将调用的HTTP包装器的请求方法:
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
let req: Request = this.buildRequest(url, options);
this.beforeCall(req);
var observable = this.http
.request(req)
.retry(3)
.catch(res => {
debugger;
console.log("ERROR! " + res.status);
if(res.status == 401){
this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
return this.securityService.registerSession().subscribe(() => {
// What to do here so the client gets the result of the original request ??
});
}
})
.do((res:Response) => { this.afterCall(req, res) });
return observable;
}
request(url:string | request,options?:RequestOptionsArgs):可观察{
let req:Request=this.buildRequest(url,选项);
此。调用前(req);
var observable=this.http
.请求(req)
.重试(3)
.catch(res=>{
调试器;
console.log(“错误!”+res.status);
if(res.status==401){
this.logger.log('未经授权的请求。正在尝试注册会话,然后重试请求');
返回此.securityService.registerSession().subscribe(()=>{
//在这里该怎么做才能让客户端获得原始请求的结果??
});
}
})
.do((res:Response)=>{this.afterCall(req,res)});
可观测收益;
}
初始化会话后,您可以使用可观察对象的flatMap操作符再次执行请求:
var observable = this.http
.request(req)
.retry(3)
.catch(res => {
debugger;
console.log("ERROR! " + res.status);
if(res.status == 401){
this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
return this.securityService.registerSession().flatMap(() => {
return this.http.request(req); // <--------
});
}
})
.do((res:Response) => { this.afterCall(req, res) });
return observable;
}
var observable=this.http
.请求(req)
.重试(3)
.catch(res=>{
调试器;
console.log(“错误!”+res.status);
if(res.status==401){
this.logger.log('未经授权的请求。正在尝试注册会话,然后重试请求');
返回此.securityService.registerSession().flatMap(()=>{
返回this.http.request(req);//{this.afterCall(req,res)};
可观测收益;
}
看起来像是@Günter:Related的dup,但不是dupe IMO。我想在包装器中处理错误并对其进行处理,然后重试。他想向调用者返回错误反馈。此解决方案是否已实施?我一直在尝试执行相同的操作,但没有任何成功。如果您可以发布完整的解决方案。这意味着什么重试(3)
?如果一次失败,请求执行3次?
var observable = this.http
.request(req)
.retry(3)
.catch(res => {
debugger;
console.log("ERROR! " + res.status);
if(res.status == 401){
this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
return this.securityService.registerSession().flatMap(() => {
return this.http.request(req); // <--------
});
}
})
.do((res:Response) => { this.afterCall(req, res) });
return observable;
}