angular - forkJoin 和拦截器一起不起作用
问题描述
我forkJoin
用于多个请求。它运作良好。
但是,在我添加拦截器后,它停止工作。
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem('token');
if (token) {
request = request.clone({
url: request.url,
setHeaders:
{ Authorization: `Bearer ${token}`,
'Access-Control-Allow-Origin': '*'
}
});
return next.handle(request);
} else {
this.router.navigate(['/login']);
return next.handle(request);
}
}
forkJoin
代码:
const s0 = return this.http.get < IEntityOne > ('u1');
const s1 = return this.http.get < IEntityTwo > ('u2');
forkJoin([s0, s1]).subscribe(
([v1, v2]) => {
console.log(v1); // <-------- This line of code is never reached
}
)
经过一些谷歌搜索,我将代码更改为
return next.handle(request).pipe(take(1));
但它仍然无法正常工作。
解决方案
forkJoin
操作员只会在所有内部 observables 完成后才发出-因此在这种情况下,如果这些调用中的一个或没有一个成功完成,那么forkJoin
observable 将不会发出任何东西(导致不发生日志记录)。
对于初学者,请在您使用的任何开发人员工具中检查您的网络选项卡以查看这些请求,并确保您从后端获得响应。
其次,正如@eko 指出的那样,尝试 combineLatest。创建该可观察对象时,它会在任何内部可观察对象完成时发出。这样,如果两个都成功完成,您将看到 2 个控制台日志,如果一个完成,则看到 1 个,等等。
最后,您不应take
在拦截器中使用运算符(在此上下文中)。由于拦截器旨在充当某种“管道”(不是 Angular 管道,只是在 Http 请求流经它们的意义上),使用take(1)
将导致对后端的任何请求(在第一个之后)根本不返回。
推荐阅读
- excel - 过滤然后将值复制并粘贴到新的 Excel 选项卡
- curl - 通过终端在谷歌云上下载 zip
- android - GeofencingClient 需要花费大量时间来添加地理围栏
- docker - Docker 使用静态 IP 与 docker 通信
- html - 使用自定义字体 - 无法在 Oracle Apex 中解码下载的字体
- c++ - 在 Ubuntu 上从 C++ 调用 Matlab
- javascript - 在 rxjs 中订阅一个变量
- python - Python - 空类构造函数(样式)
- storage - 为什么每次我在 Laravel 中保存图像时都会创建文件夹?
- neural-network - 前馈神经网络的 3D 输入