【问题标题】:Check if Storage is Empty Ionic 4 Storage plugin检查存储是否为空 Ionic 4 存储插件
【发布时间】:2019-08-15 11:55:33
【问题描述】:

我对 Angular/TypeSript/Ionic 4 相当陌生,所以这可能有点傻,但我使用的是 Ionic Storage 插件,你可以在此页面“https://ionicframework.com/docs/building/storage”中找到它。我遇到了 我的公平份额的麻烦。文档很清楚但是太简单了。

我需要检查我的存储空间是否为空,并查看存储空间的内容。

首先,我尝试通过长度来处理它,期望它返回一个数字,但在服务上使用此代码:

getLenght(){
    return this.storage.length().then((res) => {
      return res;
    });
}

我页面上的这段代码我得到了一个对象结果:

   storageLength : any; // it would give me error as a Number
clearStorage() {
    this.dataStorageService.clear();
    this.storageLength = this.dataStorageService.getLenght(); // returns object promise
    alert(JSON.stringify(this.storageLength)); 
//{"__zone_symbol__state":null,"__zone_symbol__value":[]}

然后我尝试了这个,但由于错误,我什至无法运行它:

this.storage.get("qrCodeData").then( this.storage.get("qrCodeData") =>{}).catch(err=>{
    console.log("Your data don't exist and returns error in catch: " + JSON.stringify(err);
    });

错误是“'Promise' 类型的参数不可分配给 '(value: any) => any' 类型的参数。 类型 'Promise' 不匹配签名 '(value: any): any'"

所以不确定如何验证存储是否为空,因为我遇到了各种各样的问题,我在这里错过了什么?

【问题讨论】:

    标签: angular typescript ionic-framework


    【解决方案1】:

    目前尚不清楚您正在存储什么,或者您想要实现什么。也就是说,在我看来,如果你使用 async/await,那么处理从这个 Storage 模块返回的承诺信息会更干净。下面是一个例子。

    let qrInfo = await this.getQrCodeData();
    console.log(`Here is the result: ${qrInfo}`);  
    
    ...
    
    async getQrCodeData(): Promise<string> {    
        await this.storage.ready();
        let qrCodeInfo = await this.storage.get("qrCodeData");
        return (qrCodeInfo) ? JSON.stringify(qrCodeInfo) : "";
    }
    

    【讨论】:

    • 正如函数名称所说,我想获得一些将存储在 ionic storage 中的二维码,感谢您的回答,我认为我应该将所有存储调用都设为异步,对吗?这可能是异步等待的最佳方式,然后我会尝试将其添加到我的应用程序中
    • 任何使用await的函数都需要标记为async。如果你不喜欢 async/await,你可以使用 then 的 Promise,但我认为这变得不那么可读/可维护了。 Ionic Storage API 自然会在ready() 检查以及getsetremove 等上返回承诺。所以无论如何你都需要以某种方式返回承诺。
    【解决方案2】:

    你可以试试这样的:

    getLength() { 
     return new Promise(resolve => {
          this.storage.get('qrCodeData').then((data) => {
            if(data){
              resolve(data);
            }    
          });    
        })    
    } 
    

    如果数据为空,数据将是未定义的,因此您可以检查它。

    【讨论】:

    • 你好@Sam,感谢您的回答,您的函数似乎返回与我第一次尝试函数完全相同的“getLengthFirstTry(){return this.storage.length().then((res) = > {return res;}); }" 它返回您可以在警报时使用 JSON.stringify 读取的对象承诺,还有其他方法可以读取它吗?或获取号码?我正在寻找一种更合适的方式来“检查是否为空”?
    • 我认为这是唯一的方法。如果值为空,您只能这样检查。
    • 可以先尝试解析一下,看看字符串是否为空。
    • 问题通常是存储返回一个未定义的对象,如果它是空的,我真的不明白你为什么收到一个json对象。
    • 我知道上面只是一个例子,但要小心它,因为如果没有数据它不会解决。它也不处理错误拒绝(例如,如果调用它时存储还没有准备好)。这可能会导致承诺永远不会像上面的代码那样返回。
    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 2018-05-10
    • 2019-05-27
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多