【问题标题】:Data initializing with promises使用 Promise 初始化数据
【发布时间】:2018-07-14 14:46:35
【问题描述】:

我在数据初始化和承诺方面真的很挣扎。我正在使用带有 Angular 和 Ionic 存储的 Ionic 3,但我的问题主要与 Promise 的运作方式有关。

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

  • 当我的应用启动时,它应该使用本地存储集合
  • 如果本地存储集合不存在或为空,使用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);
        }
      );
});}

我不喜欢它的某些部分,例如在一个 Promise 中返回一个 Promise - 这真的是个问题吗?

提前致谢

【问题讨论】:

    标签: javascript angular promise ionic3


    【解决方案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;
    }
    

    【讨论】:

    • 但是考虑一下如果 Promise 应该遵循它们的错误路径会发生什么。除非在每个阶段都捕获到错误并且将虚假值强制沿成功路径前进,否则(await x() || (await y()) || (await z())) 中的流程将不会像您(通常)想要的那样。将“测试 1”的结果与“测试 2”here 的结果进行比较。
    • @Roamer-1888 - 这不是生产代码,它是一段显示概念的代码。您应该使用 try catch 来处理每个方法中的错误。另外,您可以修改getItems() 方法,使其无法使用或命令。
    猜你喜欢
    • 2019-05-06
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多