http拦截器如何为发出的每个请求创建?

时间:2018-09-19 05:09:58

标签: angular request httpclient interceptor

customInterceptor.js

counter = 0;

constructor() {
 console.log('interceptor : '+this.counter);
}

日志

用于登录请求: example.com/users

interceptor : 0
interceptor : 1 
interceptor : 2
interceptor : 3

注销并再次登录: example.com/users

interceptor : 10
interceptor : 11 
interceptor : 12
interceptor : 13

试图找出我是否创建了多个拦截器实例,我从

调用了它

app.module.ts

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

http.service.ts

counter = 0;
req_counter = 0;

constructor(private injector: Injector) {
 console.debug(this.counter++, injector.get(HTTP_INTERCEPTORS);
}

get(url: string, options){
console.debug(req_counter++.concat(' : ', url);
 ...
}

1 个答案:

答案 0 :(得分:2)

通常,。您看到的可能是因为依赖注入的工作方式。它们是拦截器并没有多大关系,它会在每种服务中发生。

拦截器是您需要提供的服务。如果您多次提供它们,则将在需要使用它们时创建多个实例。

确保仅在主NgModule(通常命名为AppModule)中执行以下操作:

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

如果您在同一拦截器(MyInterceptor)的不同模块上多次执行此操作,则会得到多个实例(如您所描述的,构造函数将被多次调用)。