如何使用 shareReplay 缓存带有请求参数的 HTTP 响应

hua*_*eng 4 angular rxjs6 rxjs-observables

我有一个场景,比如我需要在单击文件时获取文件内容。我想用 缓存文件内容 API shareReplay(),如何实现?

fileService.getContent是一个 API 服务,它将通过以下方式获取内容params(repository_id, filePath);

问题:

  • 我应该在哪里使用shareReplay() pipe?内部 API 服务?或者我在下面写的地方。
  • 下面的代码无法按预期工作。该API会被多次触发。如何缓存 API 以便shareReplay()仅调用一次。

成分

fileOpened$ = new Subject();
...

this.fileOpened$.pipe(
    switchMap(file => this.fileService.getContent(this.repository_id, file.filePath)),
       shareReplay(1)
);
Run Code Online (Sandbox Code Playgroud)

服务

getContent(repoId: string, path: string): Observable<string> {
    return this.http.get<string>(
        `/api/xxx/${repoId}/files/${decodeURIComponent(path)}`,
        {
            responseType: 'text' as 'json'
        });
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*tra 5

shareReplay我会在服务中添加代码。由于参数的存在,您可以创建一个Map缓存Observables.

这里是我创建的stackblitz来演示。