如果订户未在 angular 2/4/6 中完成,如何等待 return 语句
How to wait return statement if subscriber not completed in angular 2/4/6
目前我在做Angular6项目,我有auth-http-interceptor。此文件中的问题是我每次都想从 angular4-adal 服务获取刷新 token/acquire 令牌,为此,我必须订阅将提供令牌的获取令牌,然后想在中分配该令牌authReq 对象。
但是我的拦截方法的 return 类型是 Observable。
那我怎么等订阅acquire token然后return next.handle(authReq)。
我曾尝试编写以下代码,但它抛出错误 => 声明类型既不是 'void' 也不是 'any' 的函数必须 return 一个值。
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));
});
}
}
感谢任何帮助。
您缺少 return
,而且您不能 return 来自 subscribe
的任何内容。您可以使用 flatMap
首先获取令牌,然后 return 请求,还可以重新放置您的 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));
}
目前我在做Angular6项目,我有auth-http-interceptor。此文件中的问题是我每次都想从 angular4-adal 服务获取刷新 token/acquire 令牌,为此,我必须订阅将提供令牌的获取令牌,然后想在中分配该令牌authReq 对象。
但是我的拦截方法的 return 类型是 Observable。
那我怎么等订阅acquire token然后return next.handle(authReq)。 我曾尝试编写以下代码,但它抛出错误 => 声明类型既不是 'void' 也不是 'any' 的函数必须 return 一个值。
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));
});
}
}
感谢任何帮助。
您缺少 return
,而且您不能 return 来自 subscribe
的任何内容。您可以使用 flatMap
首先获取令牌,然后 return 请求,还可以重新放置您的 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));
}