角度等待订阅完成,然后返回

时间:2019-03-11 13:52:45

标签: angular ionic-framework ionic4

在我的离子应用程序中,我检查用户是否通过isAuthenticated方法进行了身份验证。
isAuthenticated()中,我检查存储中是否有有效的令牌。
如果访问令牌已过期,则刷新令牌,然后再次返回新的访问令牌。
我的问题是,当我尝试使用refreshToken方法刷新令牌时,应用程序不会等到完成时才将访问令牌返回为空。

export class AuthService {
    token: JwtToken;
    isAuthenticated(): Promise<boolean> {
        return this.getToken().then(token => {
            return token != null;
        });
    }

    getToken(): Promise<JwtToken> {
        return this.storage.get('token').then(async (token: JwtToken) => {
            if (token == null) {
                return null;
            }
            const jwtHelper = new JwtHelperService();
            if (jwtHelper.isTokenExpired(token.access_token)) {
                console.log('1');
                // I need wait until the function below finished
                await this.refreshToken(token);
                console.log('3');
                // and then return refreshed access token
                return this.token;
            } else {
                return token;
            }
        });
    }

    async refreshToken(token: JwtToken) {
        console.log('2-1');
        return await this.http.post('http://api.com/auth/refresh', {refresh_token: token.refresh_token}).subscribe(async (res: JwtToken) => {
            console.log('2-2');
            this.token = res;
            await this.setToken(res);
            console.log('2-3');
            return this.token;
        });
    }
}

这是控制台输出:

1
2-1
3
2-2
2-3

当我需要它的时候

1
2-1
2-2
2-3
3

它以某种方式忽略了await refreshToken(token) ...

2 个答案:

答案 0 :(得分:0)

解决方案是使用async,这样等待: 如果要调用函数RefereshToken: let result = await RefereshToken(argument); 以及RefereshToken原型的功能,您应该像这样: 异步refreshToken(令牌:JwtToken){         返回this.http.post('http://api.com/auth/refresh',{refresh_token:token.refresh_token})。subscribe(async(res:JwtToken)=> {             this.token = res;             等待this.setToken(res);             返回this.token;         });     }

答案 1 :(得分:0)

这个question帮助我解决了问题。

我这样更改了refreshToken

refreshToken(token: JwtToken) {
    return new Promise(resolve => {
        this.http.post('http://api.com/auth/refresh', {refresh_token: token.refresh_token}).subscribe(async (res: JwtToken) => {
            this.token = res;
            await this.setToken(res);
            resolve();
        });
    });
}