重用从HTTP请求收集的数据(可观察的)

时间:2017-12-12 14:53:20

标签: angular rxjs angular-http angular2-observables

我从Web服务获取整个菜单,这是巨大的。它有> 10000件物品。首先,我想根据用户点击的内容做出请求,但由于它是一个菜单,因此会有很多点击和大量请求。所以我想,最好只加载完整的结构,然后根据需要查询那个巨大的json。

我的想法是,当我第一次调用该服务时,它会检查它是否有任何数据。如果没有,则发出http请求并将数据映射到服务中的变量。然后,当我需要子类别或其他什么时,我查询该数据,我不需要为菜单制作数百个http请求。但是,我觉得我做得还不好。它有效,但看起来很糟糕。特别是我期望数据存在的部分(参见下面的getSubCategories方法)。这是代码,请随时通知我,如果有任何严重问题或提供改进代码的想法:

  getMainCategories() {
    if (this.dataStore.length > 0) {

      return of(this.generateMainCategories(this.dataStore));
    } else

      if (this.observable) {

        return this.observable;
      } else {

        this.observable = this.http.get<ICategory[]>(`${this.apiUrl}/categories`).pipe(
          tap(() => {

            console.log('"getCategories" service called.');
          }),
          map((data) => {

            this.observable = null;
            this.dataStore = data;
            return this.generateMainCategories(this.dataStore);
          })
        ).share();
        return this.observable;
      }
  }

  getSubCategories(_id: string) {
    if (this.dataStore.length > 0) {

      return of(this.dataStore.find(x => x.TermCategoryUrl === _id));
    } else {

      return this.getMainCategories().pipe(

        map((data) => {

          return this.dataStore.find(x => x.TermCategoryUrl === _id);
        })
      );
    }
  }

0 个答案:

没有答案