-2

在我的应用程序中,我使用 rxjs,并且我有一个如下所示的方法:

query<T extends TableRow>(queryString: string, silent = false): Observable<T[]> {
  return this.sqliteService.dbQuery<T>(queryString).pipe(
    tap(val => {
      if (this.configService.debugMode && !silent) {
        console.log(`\n${queryString}`);
        console.log(val);
      }
    })
  );
}

我的query方法 interlly 调用dbQuery查询一个 sqlite 数据库。

此外,该query方法在我的应用程序中被多次调用。所以我想queryString在相同的时候全局缓存结果。

换句话说,我希望该query方法通过返回先前缓存的值来避免在使用之前已调用dbQuery的参数调用时再次调用。queryString

不确定这是否相关:我的query方法存在于 Angular 单例服务中。

4

2 回答 2

1

第一次通过时,将远程值保存到本地缓存属性,其中的键是查询字符串。

在后续请求中,返回相应键的现有属性。

private cache = {};

query<T extends TableRow>(queryString: string, silent = false): Observable<T[]> {
  if (this.cache.hasOwnProperty(queryString)) {
    return of(this.cache[queryString]);
  }

  return this.sqliteService.dbQuery<T>(queryString).pipe(
    tap(val => {
      this.cache[queryString] = val;

      if (this.configService.debugMode && !silent) {
        console.log(`\n${queryString}`);
        console.log(val);
      }
    })
  );
}
于 2020-03-14T15:35:55.780 回答
0

我最终得到了以下解决方案:

private cache: Observable<string>[] = [];

getItem(id: number): Observable<string> {

  if (!this.cache[id]) {
    this.cache[id] = this.query<string>(
      `SELECT column FROM table WHERE id = ${id}`
    ).pipe(shareReplay());
  }

  return this.cache[id];
}
于 2020-03-15T09:48:32.700 回答