0

我正在尝试获取使用离子存储存储的令牌并将其存储在全局变量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不会改变。

4

2 回答 2

1

就像其他人指出的那样,您需要了解 Promise 是如何工作的。方法如下: 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 方法名称前面的async关键字,这表明您将等待在其中完成承诺。然后是await关键字,它将确保它之后的其余代码仅在 promise 解决时执行。

由于 Promise 也可能被拒绝,因此您需要执行以下操作:

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
  }
}
于 2019-01-02T11:13:59.627 回答
0

在 loadToken 中调用 setHeaders,因为它异步返回数据,

loadToken(){
    this.storage.get(TOKEN_KEY).then((token)=>{
      this.token = token;
      console.log(this.token);
      this.headers = this.setHeaders();
    });
}
于 2019-01-02T02:38:21.570 回答