【问题标题】:Ionic local storage not getting the data离子本地存储未获取数据
【发布时间】:2019-01-02 19:13:59
【问题描述】:

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

【问题讨论】:

    标签: angular ionic3 ionic-storage


    【解决方案1】:

    就像其他人指出的那样,您需要了解 Promise 的工作原理。 以下是一些方法: 1:LoadToken需要返回一个promise:

    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 关键字,表示您将在其中等待 Promise 完成。 然后是 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
      }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有没有办法等待令牌从存储中完全加载?
      • 使用 loadToken().then
      • 您需要从loadToken() 回复@Sajeetharan 上述建议的承诺
      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2020-05-07
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多