如果订户未在角度2/4/6中完成,如何等待返回语句

时间:2018-07-27 06:22:15

标签: angular publish-subscribe angular6 adal angular-observable

目前,我正在Angular6项目上工作,并且拥有auth-http-interceptor。该文件中的问题是我想每次都从angular4-adal服务获取刷新令牌/获取令牌,为此,我必须订阅将获得令牌的获取令牌,然后要在authReq对象中分配该令牌

但是我的拦截方法的返回类型是Observable。

那我该如何等待订阅获取令牌,然后返回next.handle(authReq)。 我尝试编写下面的代码,但是它引发错误=> 声明类型既不是“ void”也不是“ any”的函数必须返回一个值。

  

auth-http-interceptor.ts

@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
    constructor(private adalService: AdalService, private loaderService: LoaderService) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        this.adalService.acquireToken('###myTenantId').subscribe((token) => {
            this.loaderService.display(true);
            const authReq = req.clone({
                url: environment.apiUrl + req.url,
                headers: req.headers
                .set('Content-Type', 'application/json')
                .set('Authorization', 'Bearer ' + token)
            });
        return next.handle(authReq).finally(() => this.loaderService.display(false));
        });
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您缺少return,并且您也无法从subscribe返回任何内容。您可以使用flatMap首先获取令牌,然后返回请求,还重新放置finally,并且还应该具有某种错误处理程序:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.adalService.acquireToken('###myTenantId').flatMap((token) => {
        this.loaderService.display(true);
        const authReq = req.clone({
            url: environment.apiUrl + req.url,
            headers: req.headers
            .set('Content-Type', 'application/json')
            .set('Authorization', 'Bearer ' + token)
        });
      return next.handle(authReq);
    })
    .catch((err) => {
      // error handling here
      return Observable.throw(err)
    })
    .finally(() => this.loaderService.display(false));
}