离子本机存储: storage.getItem() 不起作用[重复]

Posted

技术标签:

【中文标题】离子本机存储: storage.getItem() 不起作用[重复]【英文标题】:Ionic native storage : storage.getItem() does not work [duplicate] 【发布时间】:2019-12-05 17:50:42 【问题描述】:

我正在使用离子原生存储来存储一些数据。当我使用setItem()getItem() 存储和检索数据时,它工作得很好。但是当我在then 块中分配由getItem() 检索的值时。它在块外不起作用。

showDetails(name: string) 
    this.stg.getItem(name).then(data => 
      console.log(data);
      
      this.pathName = data.name;
      this.type = data.type;
      this.positions = JSON.parse(data.positions);
      
      console.log(this.positions);
      
    );

    console.log(this.pathName + " " + this.type);
  

当我在控制台中打印数据时,我得到了结果,当我在 then 块内打印单个值时,我也得到了结果,但最后一个 console.log 向我显示 undefined undefined。

【问题讨论】:

【参考方案1】:

getItem 似乎返回了一个 Promise,如在 documentation 中所见。这意味着this.pathName 只会在您提供给then 的回调中设置。如果这是异步的,那么当你的未定义行运行时,then 回调还没有被调用,因此没有设置任何值。这是异步编程的陷阱之一。

更好的方法是将所有逻辑放在回调中:

showDetails(name: string) 
    // get item could be async so do not assume your callback will be run immediately
    this.stg.getItem(name).then(data => 
      console.log(data);

      this.pathName = data.name;
      this.type = data.type;
      this.positions = JSON.parse(data.positions);

      console.log(this.positions);

      // values now been set
      console.log(this.pathName + " " + this.type);
    );

    // at this point no values have been set as the callback has not been called
    console.log(this.pathName + " " + this.type); // so this line is undefined
  

【讨论】:

这有效,但仅在内部有效。当我试图返回值或在then 之外使用它时,它有一个未定义的值。 此问题已被标记为重复,并且提供了一些具有类似问题的其他问题。我建议您查看这个彻底的answer 以了解类似的问题。 ?理解这是一个困难但重要的步骤。

以上是关于离子本机存储: storage.getItem() 不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

持久化的本地存储,localStorage

离子原生存储在 iOS 上不起作用

离子本机页面转换不起作用

如何使用离子devapp运行本机相机

如何为离子框架编写自定义/自己的插件

离子/ cordova与2020年原生反应