离子存储:奇怪的行为?

时间:2019-05-07 13:05:50

标签: ionic-framework ionic4

我尝试使用Ionic Storage模块存储一些值,例如我的身份验证令牌:

/**
   * Get Token
   */
  public get token(): string {
    this.storage.get(this.LS_TOKEN).then((val) => {
      console.log(val);
      this._token.next(val);
      console.log( this._token.getValue());
    });

    return this._token.getValue();
    // return 'testtttt';
  }

我尝试了多种操作,直接返回值,设置值并返回变量... 但是我总是得到一个null,奇怪的是,如果我直接返回一个字符串,它会起作用,当我console.log val时,它会显示我想要的字符串,但是返回始终为空。.

我在做什么错了?

编辑:

响应第一个答案,我已经尝试过:

/**
   * Get Token
   */
  public get token() {
    this.tokenPromise().then(yourToken => {
      console.log(yourToken);
      return yourToken;
    });
  }

  public tokenPromise() {
    return new Promise((resolve, reject) => {
      this.storage.get(this.LS_TOKEN).then((val) => {
        resolve(val);
      }).catch(ex => {
        reject(ex);
      });
    });
  }

我的问题是一样的,当我尝试使用以下组件时:console.log(this.sharedService.token);

它仍然为空

2 个答案:

答案 0 :(得分:0)

您正在从storage.get()方法获得一个Promise。 这意味着它正在异步运行。 您可以返回Promise。

public get token() {
    return new Promise((resolve, reject)=>{
        this.storage.get(this.LS_TOKEN).then((val) => {
            resolve(val);
        }).catch(ex=>{
            reject(ex);
        });
    });
}

您可以通过异步函数接收此消息并等待结果:

async loadToken(){
   let loadedToken = await this.token();
   // use your loadedToken here...
}

或者您可以像这样从诺言中使用.then方法:

loadToken(){
    this.token().then(yourToken=>{
        // use the token yourToken here...
    });
}

答案 1 :(得分:0)

它不适用于您的新token()方法。 现在仍然不同步。我要告诉你:

public get token() {
    return new Promise((resolve, reject)=>{
        this.storage.get(this.LS_TOKEN).then((val) => {
            resolve(val);
        }).catch(ex=>{
            reject(ex);
        });
    });
}

现在,您可以像下面这样使用来自共享服务的令牌:

this.sharedService.token.then(token=>{
    //use token here;
});

或者您可以使用await,但是调用它的函数必须异步:

async useTokenFromService(){
    let token = await this.sharedService.token;
    console.log(token);
}