0

Есть сервис пользователей в котором реализована работа с бэкендом по авторизации, регистрации и так далее.

Алгоритм такой:

Есть метод получения токена из ЛС:

getToken() {
        this.token = this.storageService.get('token');
        return true;
    };

И проверки этого токена на стороне сервера:

tokenVerify() {
        return this.http.post(this.verifyUrl, JSON.stringify({
                token: this.token,
            }
        ),{headers: this.headers})
            .toPromise()
            .then(response => {
                if(response.json().token == this.token) {
                    this.headers.append('authorization', `JWT ${this.token}`);
                }

            })
            .catch(this.handleError);
    };

В случае успешной проверки токен будет включен во все хедеры запроса.

А так же метод проверки авторизации

checkAuth() {
        if (this.getToken() && this.tokenVerify()) {
            return true;
        }
        else return false
    };

+Есть метод получения имени пользователя через токен

getMyUserName(): Promise<ICatalogUser> {
    console.log('Получаем имя');
    console.log(this.headers);

    return this.http.get(this.meUrl, {headers: this.headers})
        .toPromise()
        .then(response =>  response.json() as ICatalogUser)
        .catch(this.handleError);
};

Главная проблема в том что метод проверки токена асинхронный и метод получения имени асинхронный и когда я пытаюсь в компоненте проверять авторизацию и получать имя пользователя то ничего не выходит из-за того что токена еще нет во время проверки:

ngOnInit(): void {
        this.getPosts();
        this.checkAuth();
        this.user = this.userService.me;
    }

Подскажите пожалуйста как лучше решить эту проблему?

Grundy
  • 81,538
Weit
  • 235

2 Answers2

0

Если метод нужен синхронный, то вместо функций введите флаги currentToken и tokenVerified, затем устанавливайте их при инициализации и проверяйте в любых комбинациях. Если они выведены в $scope - интерфейс сможет соответственно реагировать. Если нужен асинхронный, то Promise.all, например.

11111000000
  • 3,599
0

Я бы предложил, более активно использовать https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then "Promise chaining", когда вы отдаете то что надо для следующего через return и потом его используете, тогда синхронный && превратиться в цепочку асинхронных then().then()

Еще удачно расписано: http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/

Serge Markov
  • 2,181