Ионное локальное хранилище не получает данные - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь получить токен, хранящийся в ионном хранилище, и сохранить его в глобальной переменной public token = ''.Но каждый раз, когда я обращаюсь к нему с помощью this.token, значение не меняется.

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';

const TOKEN_KEY = 'access_token';

@Injectable()
export class ContactProvider {

  public url = 'myapi-link';
  public token = '';


  constructor(
    private storage: Storage,
    private http: HttpClient
  ) {

  }

  loadToken(){

    this.storage.get(TOKEN_KEY).then((token)=>{
      this.token = token;
      console.log(this.token);
    });

  }

  setHeaders(default_content_type = 'application/json'){

    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', default_content_type)
    .set('Authorization', 'Bearer ' + this.token)
    return headers;

  }

  getData(type){

    this.loadToken();
    let headers = this.setHeaders();
    return this.http.get(this.url + type, {headers: headers});

  }

}

при вызове this.setHeaders() значение this.token не изменяется.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Как и другие отмечали, вы должны понимать, как работают обещания.Вот как: 1: LoadToken должен вернуть обещание:

loadToken(){
    return this.storage.get(TOKEN_KEY);
}

Обратите внимание на ключевое слово return , которое будет возвращать обещание, возвращаемое storage.get ()

2: используйте это обещание и дождитесь его завершения, прежде чем продолжить:

async getData(type){
    this.token = await this.loadToken();
    let headers = this.setHeaders();
    return this.http.get(this.url + type, {headers: headers});
}

Запишите ключевое слово async перед именем метода getData, которое указывает, что вы будетежду обещаний, чтобы выполнить его.затем ключевое слово await , которое будет гарантировать, что остальная часть кода будет выполняться только после разрешения обещания.

Поскольку обещание также может быть отклонено, необходимо выполнить следующее:

async getData(type){
  try {
    this.token = await this.loadToken();
    let headers = this.setHeaders();
    return this.http.get(this.url + type, {headers: headers});
  } catch (error) {
     //Handle your error here
  }
}
0 голосов
/ 02 января 2019

Вызовите setHeaders в loadToken, поскольку он возвращает данные асинхронно,

loadToken(){
    this.storage.get(TOKEN_KEY).then((token)=>{
      this.token = token;
      console.log(this.token);
      this.headers = this.setHeaders();
    });
}
...