Как я могу получить доступ к HttpInterceptor из обычного сервиса? - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время мне нужно создать два экземпляра одного класса для доступа к некоторым переменным внутри 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 и, насколько я понимаю, будет классифицировать экземпляр того же класса.

UPDATE

Только что нашел способ написать, чтобы обойти это.

http.service.ts

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

interceptor.hasNext$.next(true);

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Другой способ заставить это работать без необходимости создания другого токена в провайдере - вручную вставить 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
}
0 голосов
/ 12 сентября 2018

Вы можете сделать прямо противоположное тому, что вы пытаетесь сделать.

Создайте службу (или используйте текущую службу http), которая будет содержать «разделяемую» часть (hasNext$ = new BehaviourSubject(false);), а затем вставьте ее в CustomInterceptor.

...