首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >forkJoin不支持Angular HttpInterceptor

forkJoin不支持Angular HttpInterceptor
EN

Stack Overflow用户
提问于 2018-05-31 06:22:54
回答 3查看 1.3K关注 0票数 1

我让Service从类型Observable获取令牌,让HttpInterceptor使用它在每个http请求中注入令牌。问题是,它可以很好地处理单个请求,但如果我使用forkJoin,我将得不到任何响应。

拦截器代码

代码语言:javascript
运行
复制
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
import { AppService } from './app.service';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(
    private service: AppService
  ) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.service.token$.pipe(
      map((token: string) => {
        if (token) {
          const headers = req.headers.set('Authorization', `Bearer ${token}`);
          console.log(`Request for url ${req.url}`);
          req = req.clone({
            headers: headers
          });
        }
        return req;
      }
      ),
      switchMap(newReq => next.handle(newReq))
    )
  }
}

像这样两个简单的请求

代码语言:javascript
运行
复制
  getUsers() {
    return this.http.get<any[]>(`https://jsonplaceholder.typicode.com/users`);
  }

  getPosts() {
    return this.http.get<any[]>(`https://jsonplaceholder.typicode.com/posts`);
  }

并且在组件中

代码语言:javascript
运行
复制
// Single One will work
 this.appService.getPosts().subscribe(res => console.warn(res));

// Will not work
    forkJoin([this.appService.getPosts(), this.appService.getUsers()])
      .subscribe(([posts, users]) => {
        console.log(posts, users);
      });

我在example中重现了这个错误,你可以在https://stackblitz.com/edit/angular-kpxvej中查看它

只有当我在拦截器中添加take(1)时,它才能工作,但它不会是我想要的东西,因为我得到了一个新值,因为令牌将不会使用它。

在其他情况下,如果token只是一个字符串,那么它的工作方式是这样的

代码语言:javascript
运行
复制
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = this.service.getToken();
    const headers = req.headers.set('Authorization', `Bearer ${token}`);
    console.log(`Request for url ${req.url}`);
    req = req.clone({
      headers: headers
    });
    return next.handle(req);
  }
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50614121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档