使用promises初始化数据

时间:2018-02-04 17:11:21

标签: javascript angular promise ionic3

我真的很难对数据初始化和承诺。我正在使用带有角度和离子存储的Ionic 3,但我的问题主要与承诺如何运作有关。

基本上我想实现以下目标:

  • 当我的应用启动时,它应该使用本地存储集合
  • 如果本地存储集合不存在或为空,请使用http
  • 创建一个新存储集合
  • 如果http失败,请使用本地数据创建一个集合。

到目前为止我的解决方案:

getNewsItems():Promise<any> {
  return this.storage.get(this.newsKey).then((data) => {
    if(data == null)
    { 
      return (this.buildNewsItemsViaHttp());
    } else {
      return (data);
    }
  });
}

private buildNewsItemsViaHttp(){
  return new Promise(resolve => {
    this.http.get('some/url/to/fetch/data')
      .subscribe(
        data => {
          this.newsCollection = data;
          this.storage.set(this.newsKey, this.newsCollection);
          resolve(this.newsCollection);
        },
        (err) => {
          resolve (this.buildNewsItemsViaLocalJSON());
        }
      );
});
}

private buildNewsItemsViaLocalJSON() {
  return new Promise(resolve => {
    this.http.get('assets/data/newsCollectionLocal.json')
      .subscribe(
        data => {
          this.newsCollection = data;
          this.storage.set(this.newsKey, this.newsCollection);
          resolve(this.newsCollection);
        },
        (err) => {
          console.log(err);
        }
      );
});}

我不喜欢它的某些部分,例如在承诺中回复承诺 - 这实际上是一个问题吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

一个干净的解决方案可能是使用async \ await方法:

async buildNewsItemsViaHttp(){
   return await this.http.get()....
}

async buildNewsItemsViaLocalJSON(){
   return await this.http.get()....
}

async getNewsItems(){
   return await this.storage.get()...
}

async getItems(){
     return ((await this.getNewsItems()) || (await this.buildNewsItemsViaLocalJSON()) || (await this.buildNewsItemsViaHttp()));
}

用法:

const items = await this.getItems();

您可以优化资源,缓存它们并在每个函数中返回它们。 例如:

async buildNewsItemsViaHttp(){
   let result = cache.get(); // todo

   if(!result){
        result = await this.http.get()...
        cache.set(result)
   }

    return result;
}