Похоже, что без расширения классов HttpClientModule
единственными ожидаемыми способами взаимодействия перехватчиков с соответствующими запросами являются объекты params
и headers
.
Поскольку значение времени ожидания является скалярным, оно может быть безопаснопредоставляется в качестве настраиваемого заголовка для перехватчика.
import { Inject, Injectable, InjectionToken } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { timeout } from 'rxjs/operators';
export const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');
@Injectable()
export class TimeoutInterceptor implements HttpInterceptor {
constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const timeoutValue = Number(req.headers.get('timeout')) || this.defaultTimeout;
return next.handle(req).pipe(timeout(timeoutValue));
}
}
Это можно настроить в модуле приложения следующим образом:
...
providers: [
[{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
[{ provide: DEFAULT_TIMEOUT, useValue: 30000 }]
],
...
Запрос затем выполняется с настраиваемым заголовком тайм-аута
http.get(..., { headers: new HttpHeaders({ timeout: `${20000}` }) });