我的服务如下:
export class AuthenticationService {
constructor(private api: ApiService) {
}
get isAuthenticated(): boolean {
let token = this.token;
if (!!token) {
let jwt = new JwtHelperService();
try {
if (jwt.isTokenExpired(token)) {
let refreshToken = localStorage.getItem('refresh_token');
if (!!refreshToken) {
// I need this to be boolean
return this.refreshToken(refreshToken);
}
return false;
} else {
return true;
}
} catch (e) {
this.logout();
return false;
}
}
return false;
}
// I expect this method to return a boolean value
refreshToken(refreshToken: string) {
return this.api.post<JwtToken>('/auth/refresh', { refreshToken: refreshToken })
.subscribe(user => {
if (user && user.access_token) {
localStorage.setItem('access_token', user.access_token);
}
});
}
}
通过此代码,我通过isAuthenticated
方法获得身份验证状态。
我需要此方法以boolean
的形式返回。
我的问题是refreshToken
方法返回预订,而我需要将其作为布尔值。
我可以将isAuthenticated
方法转换为Observable<boolean>
,但是我还需要在HTML中使用此方法。这就是为什么我想要它为布尔值。
我在做什么错了?
答案 0 :(得分:1)
所以这里是
get isAuthenticated(): Observable<boolean> {
let token = this.token;
if (!!token) {
let jwt = new JwtHelperService();
try {
if (jwt.isTokenExpired(token)) {
let refreshToken = localStorage.getItem('refresh_token');
if (!!refreshToken) {
return this.refreshToken(refreshToken);
}
return Observable.of(false);
} else {
return Observable.of(true);
}
} catch (e) {
this.logout();
return Observable.of(false);
}
}
return Observable.of(false);
}
refreshToken(refreshToken: string) {
return this.api.post<JwtToken>('/auth/refresh', { refreshToken: refreshToken })
.map(user => user && user.access_token)
.do(userHasAccessToken => userHasAccessToken && localStorage.setItem('access_token', user.access_token));
}
没有其他方法无需阻塞您的主要js线程,您要么需要使用 Observable / Promise 即可异步等待直到您的 http调用完成。 希望有帮助。