如果订户未在角度2/4/6中完成,如何等待返回语句 [英] How to wait return statement if subscriber not completed in angular 2/4/6

查看:85
本文介绍了如果订户未在角度2/4/6中完成,如何等待返回语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Currently I am working on the Angular6 project, and I have auth-http-interceptor. The problem in this file is that I want to get refresh token/acquire token from angular4-adal service every time, and for that, I have to subscribe the acquire token which will give the token and then want to assign that token in authReq object.

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

But my intercept method's return type is Observable.

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

Then how could I wait for subscribing the acquire token and then return next.handle(authReq). I have tried to write the below code, but its throwing an error => A function whose declared type is neither 'void' nor 'any' must return a value.


auth-http-interceptor.ts

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));
        });
    }
}

感谢您的帮助。

推荐答案

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

You are missing a return and also you cannot return anything from subscribe. You could use flatMap to first fetch the token, and then return the request, also re-place your finally and you should have some kind of error handler as well:

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));
}

这篇关于如果订户未在角度2/4/6中完成,如何等待返回语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆