当“缓存”时,挂起可观察的阻塞路由器

时间:2018-07-19 18:03:05

标签: angular rxjs observable ngrx

我试图在ngrx/effect中使用我的服务以在请求时加载数据,但是为了提高效率而缓存了请求。我已经阅读了一些示例,这些示例使用这种方法存储可观察的对象,并在存在的情况下再次将其返回,并给出publishReplay refCount重做请求的响应而不发送请求。

这一切似乎都可以正常工作-但是在第一个请求之后,如果我重新使用缓存的可观察对象,Angular路由器将停止工作。从阅读中又可以看出,到底是什么在等待观察者的诺言完成?

如何设置服务使用情况才能正确解决?

我有一个帮助服务,用于从我的API中获取数据,我正在尝试缓存这样的响应:

  getResource(params) {
    if (!this.cache[cacheKey]) {
      this.cache[cacheKey] = this.api.get(RESOURCE_URL, params)
        .pipe(
          publishReplay(1),
          refCount(),
        );
    }
    return this.cache[cacheKey];
  }

(api服务上的get方法看起来像这样)

  get(resource, params?: object): Observable<ApiResponse> {
    return this.http.get<ApiResponse>(resource, params);
  }

效果如下:

  @Effect()
  search$: Observable<Action> = this.actions.pipe(
    ofType<Search>(Types.SEARCH),
    debounceTime(300),
    withLatestFrom(this.store.select(state => state.search_properties)),
    distinctUntilChanged(),
    switchMap(([payload, store]) => {

      this.store.dispatch(new GlobalActions.SearchStarted());

      const params = merge({include: ['latestPrint']}, store);

      return this.lookupService
        .getResource(params)
        .pipe(
          map((response: ApiResponse) => {
            this.store.dispatch(new GlobalActions.SearchComplete());
            return new ResultActions.SetSearchResults(response);
          }),
          catchError(() => of(new GlobalActions.EffectError()))
        );
    })
  );

0 个答案:

没有答案