Angular Http缓存和竞争条件

时间:2018-12-11 04:07:44

标签: angular angular-httpclient

我正在尝试找出如何以最简单的方式最好地解决应用程序中的竞争条件。

我有一条带两个解析器的路由。解析器为:

GetBooksResolver

GetAuthorsResolver

现在,“作者”和“书籍”的类型均为Genre,需要将其合并。

因此在两个解析器中,您都有一个forkJoin:

// GetBooksResolver:
forkJoin(this.http.get('api/genres'), this.http.get('api/books'))
    .pipe(map(data => //merge datasets));

//GetAuthorsResolver
forkJoin(this.http.get('api/genres'), this.http.get('api/authors'))
    .pipe(map(data => //merge datasets));

我有一个简单的HTTP缓存服务,可以正确阻止HTTP请求再次触发,但初始竞争条件仍然存在

结果,您看到两个不同的api/genre通话

有什么方法可以设置缓存拦截器,以免发生这种情况?

1 个答案:

答案 0 :(得分:5)

正如评论中已经建议的那样,您可以创建一个将调用服务的方法,以返回重放Observable,如下所示:

public getGenres(): Observable<Genre> {
  return this.httpClient.get('api/genres').pipe(
    shareReplay(1)
  );
}

然后,您调用此方法以获取重播Observable并将其用于两个forkJoin方法:

const genres$ = this.getGenres();
// GetBooksResolver:
forkJoin(genres$, this.http.get('api/books'))
    .pipe(map(data => //merge datasets));

//GetAuthorsResolver
forkJoin(genres$, this.http.get('api/authors'))
    .pipe(map(data => //merge datasets));

我还创建了一个有效的StackBlitz示例,以便您在实际操作中看到它。