Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
如何让guard订阅Angular 2中服务的长轮询请求_Angular_Service_Long Polling_Angular Router_Angular Guards - Fatal编程技术网

如何让guard订阅Angular 2中服务的长轮询请求

如何让guard订阅Angular 2中服务的长轮询请求,angular,service,long-polling,angular-router,angular-guards,Angular,Service,Long Polling,Angular Router,Angular Guards,我正在尝试制作一个旧时尚应用程序的angular 2版本。有一个服务向服务器发送定期请求,以检查用户是否正在登录。登录守卫将检查轮询,以查看登录会话结果(从请求中获取)是否有效,从而向路由返回正确的信号 这是“我的服务”的功能: getUser():可观察{ 返回this.http.get(this.userUrl); } 这是我的警卫的canActive功能: canActivate( 下一步:ActivatedRouteSnapshot, 状态:RouterStateSnashot):可观察

我正在尝试制作一个旧时尚应用程序的angular 2版本。有一个服务向服务器发送定期请求,以检查用户是否正在登录。登录守卫将检查轮询,以查看登录会话结果(从请求中获取)是否有效,从而向路由返回正确的信号

这是“我的服务”的功能:

getUser():可观察{
返回this.http.get(this.userUrl);
}

这是我的警卫的canActive功能:

canActivate(
下一步:ActivatedRouteSnapshot,
状态:RouterStateSnashot):可观察的|承诺|布尔值{
//const isLoggedIn=this.authService.isLoggedIn();
返回此.authService.getUser().flatMap((数据)=>{
控制台日志(数据);
如果(data.id==1&&data.name==='Beany'){
控制台日志(1111)
可观察的返回(真);
}否则{
console.log(2222)
this.router.navigate(['pages/login']);
可观察到的返回(错误);
}
});


路由工作,但仅1次。不确定是否可以重复此操作(当请求完成时,服务将向服务重新发送检查,当然我应该为其设置一点超时)?

事实上,我认为检查会话超时不是一个好的做法。
canActivate
guard是一个简单的检查,例如,用户是否有权打开此路由。为了检查会话超时,我会在您的服务中放入一个计时器,它会调用后端获取信息。我也会使用
HttpInterceptor
检查来自后端的错误。当您的后端将发送一条带有代码
401 UNAUTHORIZED
的错误消息时,它将引导用户进入登录页面,如下图所示

@Injectable()
export class UnauthorizedInterceptor implements HttpInterceptor {

    constructor(private router: Router) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(req).catch(err => {
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    this.router.navigate(['/Login']);
                }
            }
            return Observable.throw(err.statusText);
        });
    }
}
@Injectable()
导出类UnauthorizedInterceptor实现HttpInterceptor{
构造函数(专用路由器:路由器){}
截取(req:HttpRequest,next:HttpHandler):可观察{
返回next.handle(req.catch)(err=>{
if(HttpErrorResponse的错误实例){
如果(错误状态===401){
this.router.navigate(['/Login']);
}
}
返回可观察的抛出(错误状态文本);
});
}
}

你的路线结构是什么?警卫适用于哪些路线?你想使用
承诺
。尝试
.toPromise()
在你的
可观察的
上从
内部激活(…)