Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在Anuglar中刷新调用后无法重试同一请求_Angular_Angular Http Interceptors - Fatal编程技术网

Angular 在Anuglar中刷新调用后无法重试同一请求

Angular 在Anuglar中刷新调用后无法重试同一请求,angular,angular-http-interceptors,Angular,Angular Http Interceptors,刷新呼叫后,我无法重试相同的请求。我尝试了next.handle(更新的请求),但它仍然没有运行。你能帮个忙吗 仅供参考:我在这里附上了我的代码。如果我遗漏了什么,请告诉我 intercept(req:HttpRequest,next:HttpHandler):可观察{ 这个.presentLoading(); const headerSettings=req.headers.keys().reduce((acc,cur)=>{ acc[cur]=请求头.getAll(cur); 返回acc;

刷新呼叫后,我无法重试相同的请求。我尝试了
next.handle(更新的请求)
,但它仍然没有运行。你能帮个忙吗

仅供参考:我在这里附上了我的代码。如果我遗漏了什么,请告诉我

intercept(req:HttpRequest,next:HttpHandler):可观察{
这个.presentLoading();
const headerSettings=req.headers.keys().reduce((acc,cur)=>{
acc[cur]=请求头.getAll(cur);
返回acc;
}, {});
从promise(this.storage.get('userdata')).pipe(mergeMap((令牌:any)=>{
如果(令牌)
headerSettings[“Authorization”]=token.access\u token;
let Header=新的HttpHeader(headerSettings),
newRequest=req.clone({headers});
返回next.handle(newRequest)
.pipe(catchError((err:any)=>{
if(HttpErrorResponse的错误实例){
//令牌已过期。请刷新并重试
如果(错误状态===401){
if(令牌和令牌。刷新令牌){
this.login.refresh(token.refresh\u token).subscribe((数据:any)=>{
if(data.data)
headerSettings[“Authorization”]=data.data.access_令牌;
Header=新的HttpHeader(headerSettings);
让retryRequest=newRequest.clone({headers});
返回next.handle(retryRequest);
});
}否则{
this.route.navigate(['/tabs/login']);
}
}否则{
返回可观察的抛出(错误状态文本);
}
}否则{
返回可观察的抛出(错误状态文本);
}
}));
}))
}

我不能完全确定为什么您的内部订阅没有触发,但我猜测RxJS正在取消它,因为它位于可丢弃的代码部分

catchError
要求返回一个
可观察的
,但您没有返回任何内容(TypeScript应该对此发出警告,但由于某种原因它从裂缝中滑了出来)

以下可能是更好的方法。内部
可观察的
将由
catchError
使用
switchMap
订阅

intercept(req:HttpRequest,next:HttpHandler):可观察{
这个.presentLoading();
const headerSettings=req.headers.keys().reduce((acc,cur)=>{
acc[cur]=请求头.getAll(cur);
返回acc;
}, {});
从promise(this.storage.get('userdata')).pipe(mergeMap((令牌:any)=>{
如果(令牌)
headerSettings[“Authorization”]=token.access\u token;
let Header=新的HttpHeader(headerSettings),
newRequest=req.clone({headers});
返回next.handle(newRequest)
.pipe(catchError((err:any)=>{
if(HttpErrorResponse的错误实例){
//令牌已过期。请刷新并重试
如果(错误状态===401){
if(令牌和令牌。刷新令牌){
返回this.login.refresh(token.refresh\u token).pipe(
switchMap((数据:任意)=>{
if(data.data)
校长设置[“授权”]=
data.data.access_令牌;
headers=新的HttpHeaders(
头饰
);
让retryRequest=newRequest.clone({
标题,
});
返回next.handle(retryRequest);
}));
}否则{
this.route.navigate(['/tabs/login']);
}
}否则{
返回可观察的抛出(错误状态文本);
}
}否则{
返回可观察的抛出(错误状态文本);
}
}));
}))
}

而不是
switchMap
我使用了
mergeMap
,因为
observeable
接受
mergeMap
。它现在正在工作。非常感谢你及时的回答。很好,很高兴它奏效了。我相信
mergeMap
switchMap
在这种情况下都会起作用,但是
switchMap
应该有一个额外的好处,即从
登录中取消订阅。使用后可以观察到刷新,从而提高内存效率。但也许我遗漏了什么——有很多事情正在发生。根据经验,RxJs逻辑几乎不需要两次调用
subscribe