刷新页面时递归调用Angular Interceptor

时间:2019-05-15 17:35:54

标签: angular interceptor angular-http-interceptors

我正在使用角度拦截器来修改所有到达API端的http请求。

仅当我从浏览器刷新应用程序时才发生这种情况。

this.httpGET('api_handshake').subscribe(response => {
    this.APIHandShakeStatus = true
    if(response['status']==true){
        this._HS_STATUS = true
    } 
}, error => {
    this.logout()
});

它调用:

httpGET(path: string, getData=null): Observable<any>  {

    const token: string = this.TOKENS.access_token;

    let headers = new HttpHeaders();
    headers  = headers.append('Content-Type', 'application/json');
    headers  = headers.append('Authorization', 'Bearer ' + token);


   let params = new HttpParams();
    params = params.append('uId', this._userDetails['uId']);
    if(getData!=null){
        for (let key in getData) {
            // Begin assigning parameters
            params = params.append(key, getData[key]);
        }
    }


    return  this._http.get(this.API_URL + path, { params, headers})
}

使用标准拦截器拦截 this._http.get

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token: string = this.global.TOKENS.access_token;

    //logging the updated Parameters to browser's console
    console.log("Before making api call : ", 'test');
    return next.handle(request).pipe(
        map((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
                console.log('event--->>>', event);
                // this.errorDialogService.openDialog(event);
            }
            return event;
        }),
        catchError((error: HttpErrorResponse) => {
            let data = {};
            data = {
                reason: error && error.error.reason ? error.error.reason : '',
                status: error.status
            };

            if(data['status']==401){
                console.log('unauthroized')
                console.log(data)
            }
            return throwError(error);
        }));
}

从头开始,我对自己进行身份验证,然后登录到调用以下函数的应用程序,它运行良好。然后,我从调用此功能的浏览器刷新应用程序。

在chrome调试器上:

httpGET('api_handshake').subscribe

线路被反复呼叫。如果我卸下拦截器,一切正常。

1 个答案:

答案 0 :(得分:1)

我能够找出问题所在。从服务到拦截器有周期性的依赖关系。但是,angular不会引发任何周期性的依赖关系错误,调试器也不会遍历所有依赖关系。花了超过半天的时间来解决这个问题。

当拦截器和服务之间存在循环依赖关系时。无法调试错误,因为此错误未在角度编译器中捕获。