Ионное локальное хранилище не получает данные
Я пытаюсь получить токен, хранящийся в ионном хранилище, и сохранить его в глобальной переменной. 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 ответа
Как и другие отметили, вы должны понимать, как работают обещания. Вот как: 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});
}
Обратите внимание на асинхронное ключевое слово перед именем метода 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
}
}
Вызовите setHeaders в loadToken, поскольку он возвращает данные асинхронно,
loadToken(){
this.storage.get(TOKEN_KEY).then((token)=>{
this.token = token;
console.log(this.token);
this.headers = this.setHeaders();
});
}