如何从普通服务访问HttpInterceptor?

时间:2018-09-11 20:43:43

标签: angular httpclient angular-http-interceptors

当前,我需要创建同一类的两个实例来访问HttpInterceptor中的某些变量。有没有一种方法可以只用一个实例来解析提供程序,并允许我在正常服务中和作为拦截器使用相同的拦截器类?

*。module.ts

.
.
Providers:[
 CustomInterceptor, // first class instance
 {
  Provide: HTTP_INTERCEPTORS,
  UseClass: CustomInterceptor, // second class instance
  multi: true,
 }
],
.
.

http.service.ts

constructor(
 interceptor: CustomInterceptor,
){}

interceptor.hasNext$.next(true);

CustomInterceptor.ts

hasNext$ = new BehaviourSubject(false);

当我在http.service.ts中调用拦截器时,我访问第一个CustomInterceptor,而对httpClient的请求是CustomInterceptor的第二个实例。因此,我在hasNext$.next(true)中的http.service.ts在第二个中永远不会改变。

有人建议我使用

Providers: [
 CustomInterceptor,
 {
  provide: HTTP_INTERCEPTORS,
  useValue: CustomInterceptor,
  multi: true,
 },
]

但是上面的代码将引发错误,因为HTTP_INTERCEPTORS令牌要求useClass并基于我的理解,该类将对同一类的实例进行分类。

更新

只是找到了一种解决此问题的方法。

http.service.ts

constructor(
 @Inject(HTTP_INTERCEPTOS) protected interceptor: CustomInterceptor,
){}

interceptor.hasNext$.next(true);

2 个答案:

答案 0 :(得分:1)

您可以执行与尝试执行的操作完全相反的操作。

创建一个包含“共享”部分(hasNext$ = new BehaviourSubject(false);)的服务(或使用当前的http服务),然后将其注入CustomInterceptor

答案 1 :(得分:0)

无需在提供程序中实例化其他令牌即可使其工作的另一种方法是在正常服务中手动注入HTTP_INTERCEPTORS。

app.moudule.ts

providers: [
 {
   provide: HTTP_INTERCEPTORS,
   useClass: CustomInterceptor,
   multi: true,
 }
],

http.service.ts

constructor (
 @Inject(HTTP_INTERCEPTORS) private interceptors: HttpInterceptors,
) {
 let interceptor = interceptors.find(x => x instanceOf CustomInterceptor);
 interceptor.hasNext$.next(true); // this way we have access to the same interceptor
}