1

Ionic Storage用于本地存储目的。要使用我创建的存储service,我有 getter 和 setter 存储方法。

我想检查应用程序的负载,是否有任何值在存储中可用,如果值在存储中不可用,而不是只想进行实际数据调用并将设置为存储,但下次病房想从存储而不是实际获取数据。

现在的问题是当我的组件被加载时,我正在调用服务的storage.get方法,这需要时间,因为该组件的属性没有设置为实际存储的正确值。

此外,用于从服务返回字符串值的方法不允许在没有最终返回语句的情况下编写方法,如下面的代码中所述[现在我已经从 Promise 添加了两个返回语句,这对我来说似乎不是正确的设计,但没有我收到编译错误],并且由于 Promise 从存储中获取响应所花费的时间,两个返回语句都在不同的时间间隔执行,这会导致存储中的实际响应过度疲劳。

我不确定如何从 Promise 管理这种情况,因为默认情况下离子存储返回 Promise。

 getDefaultLanguage(): string {

     this.storage.get('defaultLanguage').then((res) => {
       return this.defaultLanguage = res || 'en';
     });
     return this.defaultLanguage;
   }

请让我知道如何在组件中保持执行,直到我从上面使用 Promise 的服务调用得到响应,所以核心组件的逻辑可以正常工作,还想要正确的方法来实现我想要结果的服务层string来自 Promise 而不是promise<any>.

4

3 回答 3

1

感谢@Nenroz 和@mwilson 的两个回答。

它帮助我了解 Promise 的实际工作原理,我宁愿寻找直接从 Promise 返回字符串值的单一服务方法,并且还想等待进一步的代码执行直到。

由于前端框架会对自身的变化做出反应,所以与其实际要求这个问题等到从 Promise 获得价值,我会找到一种方法来设法保持 UI,直到 Promise 得到如下解决。(无需等待进一步的代码执行)

InitStorage()app.component.ts's中添加方法constructor

 InitStorage() {
     const defLanguage = this.storageService.getDefaultLanguage();
 }

StorageService.ts的方法如下返回Promise<string>

 getDefaultLanguage(): Promise<string> {
     return this.storage.get('defaultLanguage');
 }

现在等到从上述方法中获取值并停止进一步的代码执行,直到 promise 得到解决,将其实现添加ngOnInitpage.ts

 ngOnInit() {
      this.defaultLanguage = this.storageService.defaultLanguage;
 }

并将其值添加到page.html文件中,因此一旦变量 html 中的值可用框架刷新/设置,以前我无法在 HTML 中绑定其值(previously Value was getting sated after Page was getting loaded, and UI was not getting updated)

 <ion-radio-group [value]="defaultLanguage" />

我不确定servicePromisein的这种正确架构是否正确Angular,但这就是我设法在变量Storage中获得价值service并能够用正确的存储值更新 UI 的方式。

期待对架构改进的任何进一步建议,并感谢所有宝贵的建议。

于 2020-06-01T11:57:50.090 回答
0

最简单的方法是将其转换为 Promise:

getDefaultLanguage(): Promise <string> {
  return new Promise( (resolve, reject) => {
    this.storage.get('defaultLanguage').then((res) => {
      resolve(res || 'en');
    });
  });
}

您当前的方法不起作用的原因是因为this.storage.get是异步的。它不会及时完成return this.defaultLanguage工作。将您的电话包装get在另一个电话中Promise是一种方法。

于 2020-05-11T15:45:44.147 回答
0

您可以使用async等待 promise 被解决:

async getDefaultLanguage(): Promise<string> {
    const res = await this.storage.get('defaultLanguage');
    this.defaultLanguage = res || 'en';

    return this.defaultLanguage;
}

请记住,getDefaultLanguage现在必须异步调用此解决方案

于 2020-05-11T15:47:25.493 回答