Il semble que sans extension HttpClientModule
les seuls moyens prévus pour les intercepteurs de communiquer avec les requêtes respectives sont les suivants params
et headers
objets.
Puisque la valeur du timeout est scalaire, elle peut être fournie en toute sécurité comme un en-tête personnalisé à l'intercepteur, où il peut être décidé si c'est le timeout par défaut ou spécifique qui doit être appliqué via RxJS. timeout
opérateur :
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));
}
}
Ceci peut être configuré dans votre module d'application comme :
...
providers: [
[{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
[{ provide: DEFAULT_TIMEOUT, useValue: 30000 }]
],
...
La demande est ensuite effectuée avec des timeout
en-tête
http.get(..., { headers: new HttpHeaders({ timeout: `${20000}` }) });
Comme les en-têtes sont censés être des chaînes, la valeur du délai d'attente doit d'abord être convertie en chaîne.
Voici une démo .
Les remerciements vont à @RahulSingh et @Jota.Toledo pour avoir suggéré l'idée d'utiliser des intercepteurs avec timeout
.