Angular Observable HttpInterceptor ForkJoin不起作用

问题描述 投票:0回答:2

我见过很多人提到与此有关的问题,但没有找到解决方案。我做了一个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
    }
)

[不幸的是,即使我在网络标签中看到两个请求都已成功完成,也从未到达上面的代码行。有人可以给我一个解决方案吗? (以上两种获取方法都会触发Http GET请求。)

编辑

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

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

angular httpclient angular-http-interceptors fork-join
2个回答
0
投票

forkJoin仅在Observable完成时发出。但是,您的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);
        })
    );

0
投票

可观察对象需要完成才能使forkJoin发出。如果可观察对象是流,则可以使用RxJS combineLatest并在combineLatest中使用管道。尝试以下操作

take(1)
© www.soinside.com 2019 - 2024. All rights reserved.