通常希望具有将应用于所有请求的默认超时(例如30s),并且可以针对特定的更长请求(例如600s)覆盖。
据我所知,在Http中没有指定默认超时的好方法。
似乎在没有扩展HttpClientModule类的情况下,拦截器与各个请求通信的唯一预期方式是params和header对象。
由于超时值是标量,因此可以安全地将其作为自定义标头提供给拦截器,在此可以确定是否应该通过RxJS超时运算符应用它的默认或特定超时:
import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/timeout'; const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout'); const defaultTimeout = 10000; @Injectable() export class TimeoutInterceptor implements HttpInterceptor { constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout) {} intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> { const timeout = Number(req.headers.get('timeout')) || this.defaultTimeout; return next.handle(req).timeout(timeout); } } ... providers: [ [{ provide: HTTP_INTERCEPTORS,useClass: TimeoutInterceptor,multi: true }],[{ provide: DEFAULT_TIMEOUT,useValue: defaultTimeout }] ],...
然后使用自定义超时标头完成请求
http.get(...,{ headers: new HttpHeaders({ timeout: `${20000}` }) });
由于标头应该是字符串,因此应该首先将超时值转换为字符串。
这是a demo。
积分转到@RahulSingh和@ Jota.Toledo建议使用具有超时的拦截器的想法。