角度可观测的HttpInterceptor ForkJoin不工作

人气:490 发布:2022-10-16 标签: httpclient angular fork-join angular-http-interceptors

问题描述

我看到很多人提到这个问题,但没有找到任何解决方案。 我使用HttpInterceptor将令牌添加到我的请求中。由于我使用Firebase进行身份验证,因此检索令牌需要一个可观察对象。一切工作正常,并添加了令牌,但如果我将多个请求与forkJoin组合在一起,则令牌不起作用。

HttpInterceptor:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.auth.idToken.pipe(
        mergeMap((token: any) => {
            if (token) {
                request = request.clone({ setHeaders: { Authorization: `Bearer ${token}` } });
            }
            return next.handle(request);
        })
    );
}

部分服务:

forkJoin(
    this._dataService1.fetch(),
    this._dataService2.fetch(),
).subscribe(
    ([dataService1Data, dataService1Data]) => {
        alert("Completed");  // <-------- This line of code is never reached
    }
)
不幸的是,即使我在network选项卡中看到两个请求都成功完成,代码中的上面一行也从未到达。有人能给我一个解决方案吗?(上面的两个FETCH方法都会触发http GET请求。)

编辑:

this._dataService1.fetch().subscribe(data => {
    console.log(data);
});
this._dataService2.fetch().subscribe(data => {
    console.log(data);
});

上面的代码工作得非常好。正如我提到的,它确实适用于单个请求,但不适用于forkJoin

推荐答案

forkJoin仅在观察完成时发出。但是,您的Observable拦截器永远不会完成。将take(1)运算符添加到您的侦听器:

return this.auth.idToken.pipe(
        take(1),
        mergeMap((token: any) => {
            if (token) {
                request = request.clone({ setHeaders: { Authorization: `Bearer ${token}` } });
            }
            return next.handle(request);
        })
    );

683