2

我正在使用@ngrx/store从 store 获取令牌并将其放置在 HTTP 标头中,我尝试使用 flatmap mergeMap 但它们都不断复制 http 请求,当我使用 take(1) 时,它会继续循环请求并挂起,这是我有的:

@Injectable()
export class AuthInterceptorService implements HttpInterceptor {
   token$: Observable<string>;

   constructor(private readonly store: Store<fromRoot.State>) {
      this.token$ = store.select(fromAuth.getToken);
   }

   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return this.token$
               .map(token => {
                  if (token) {
                     request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
                  }
               })
              .mergeMap(() => next.handle(request));
   }
}
4

1 回答 1

4
return this.token$
           .map(token => {
              if (token) {
                 request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
              }
              return request;
           })
          .switchMap((req) => next.handle(req));

Switch map 获取一个 observable 并将其切换到另一个。在可观察序列中使用 map 时,您还需要实际传递一个值。我个人甚至会将请求作为初始可观察流的一部分。

于 2017-10-30T20:35:13.797 回答