从 Angular HttpInterceptor 中的 Observable 返回 Observable
Returning an Observable from an Observable in Angular HttpInterceptor
我正在使用 @ngrx/store 从商店获取令牌并将其放入 HTTP headers,我尝试使用 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));
}
}
return this.token$
.map(token => {
if (token) {
request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
}
return request;
})
.switchMap((req) => next.handle(req));
切换地图将一个可观察对象切换到另一个。在可观察序列中使用 map 时,您还需要实际传递一个值。我个人甚至会将请求作为初始可观察流的一部分。
我正在使用 @ngrx/store 从商店获取令牌并将其放入 HTTP headers,我尝试使用 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));
}
}
return this.token$
.map(token => {
if (token) {
request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}});
}
return request;
})
.switchMap((req) => next.handle(req));
切换地图将一个可观察对象切换到另一个。在可观察序列中使用 map 时,您还需要实际传递一个值。我个人甚至会将请求作为初始可观察流的一部分。