Angular订阅布尔

时间:2019-01-29 05:59:18

标签: angular

我的服务如下:

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中使用此方法。这就是为什么我想要它为布尔值。
我在做什么错了?

1 个答案:

答案 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调用完成。 希望有帮助。