0

我正在尝试使用离子存储来保存和加载用于访问 APP 中的后端 API 的身份验证令牌,但我无法从存储中获取值。

我已经安装了离子存储(Angular 版本),如组件 GH 页面所示:https ://github.com/ionic-team/ionic-storage ,使用以下命令:

npm install @ionic/storage-angular

然后我在我的 Globals 服务中导入了存储服务,我创建它是为了成为我的应用程序中所有全局值的中心:

import { Storage } from '@ionic/storage-angular';

@Injectable()
export class Globals {
    private _authenticationToken: string;

    constructor(private storage: Storage) {
        this._authenticationToken = null;
        this.storage.create();        
    }

    (...)

然后我创建了一个 saveToken 方法,它将已经_authenticationToken由另一种方法定义的身份验证令牌存储在离子存储中:

public saveToken() : Promise<void>
{
    console.log("Saving token");
    console.log(this._authenticationToken);
    return this.storage.set("AuthenticationToken", this._authenticationToken)
        .then(valor => console.log("token saved."));
}

当我执行该saveToken方法时,结果是这样的(忽略红色的行,它们来自其他进程,因为 saveToken 是异步的):

在此处输入图像描述

所以我的令牌被保存了,我可以在 Chrome 开发工具的应用程序选项卡中看到它的值:

在此处输入图像描述

但问题来了。当我尝试使用下面的方法加载保存的令牌时,我得到一个空值返回,就好像令牌没有保存一样。当应用程序再次打开时,我正在这样做,以恢复登录会话。

public loadToken() : Promise<void>
{
    return this.storage.get("AuthenticationToken")
        .then(v => {
            console.log("token loaded");
            console.log(v);
            this.setToken(v);
        });
}

上面的代码将产生以下消息,表明没有从存储返回值。

在此处输入图像描述

我正在使用 chrome 浏览器运行应用程序ionic serve,并认为在应用程序重新加载后存储可能会重置,但我已经检查了应用程序选项卡并且身份验证令牌在那里。

4

1 回答 1

0

在我分享可能的解决方案之前,我会解释:

public loadToken(handler: (result?: any) => void) : void
{
    this.storage.get("AuthenticationToken")
        .then(v => {
            this.setToken(v);
            handler(v);
        });
}
...

this.loadToken((result?: any) => {
     // here your result
});

这是在不移动内部逻辑的情况下使用回调来获取结果的一种方式。

你没有得到任何东西的原因是你试图返回一个异步结果(承诺)然后(); 它总是会返回 null 给你。你的结果在 then 里面。

另一种方法是这样(但是您必须从使用它的地方迁移内部的逻辑):

public loadToken() : Promise<any>
{
    return this.storage.get("AuthenticationToken");
}
...

const token = await loadToken(); // await is a syntactic sugar, it summarizes use of then(); on one line and you must wait for the result to return before continuing.
this.setToken(token);

此致。

于 2021-09-23T01:48:45.307 回答