【发布时间】:2018-12-31 05:59:45
【问题描述】:
我的一条路线上有一个解析器,以便让它在页面实际加载之前获取数据。这需要多个请求,因此我使用rxjs 函数forkJoin。这将返回大量数据,并且在所有数据完全加载之前页面不会加载,这正是我想要的。
但是,获取的数据非常庞大,这意味着在加载路径之前可能需要一段时间。我想以某种方式,仍然解决这个路由,然后缓存它并让组件知道它被缓存了。
我依赖从组件内的activatedRoute 返回的数据,因为页面需要这个。所以我需要它来停止覆盖当前存在的内容。
这是我目前的代码:
解析器:
const postId: string = this.postService.data.post.id;
const authorData$: Observable<HttpResponse<any>> = this.authorService.getAuthor();
const commentsData$: Observable<HttpResponse<any>> = this.commentsService.getComments();
我知道这可以在一个请求中完成,但这只是我将使用它的一个示例。所以我不想要将它放在一个请求中的建议。
this.activatedRoute.data.subscribe((data) => {
this.author = data[0][0];
this.comments = data[0][1].data;
});
所以我只想在组件第一次加载时执行此操作。
提前致谢。
【问题讨论】:
-
我看到了两个选项:通过拦截器 + 缓存服务(参见 angular.io/guide/http#caching)在 HttpClient 级别缓存,或者创建一个专门的有状态服务来跟踪用于请求的最后一个参数 + 请求响应。每当解析器尝试获取时,逻辑应该检查服务并确认新参数是否与先前存储的参数匹配,在这种情况下可以使用缓存的响应。
-
我从没想过最后一个选项。你个人认为最好的是什么?
-
但是,我认为第二个选项不会起作用,因为没有办法存储它所拥有的第一个选项以检查当前选项?
-
第二,http缓存主要用于在处理新请求期间重放响应。不是为了避免新的请求。
-
用 ReplaySubject 缓存它
标签: angular routes rxjs resolver