Angular HttpClient默认和特定请求超时

前端之家收集整理的这篇文章主要介绍了Angular HttpClient默认和特定请求超时前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通常希望具有将应用于所有请求的默认超时(例如30s),并且可以针对特定的更长请求(例如600s)覆盖。

据我所知,在Http中没有指定默认超时的好方法

在HttpClient中解决这个问题的方法是什么?
如何为所有传出请求定义默认超时,可以覆盖特定的超时?

似乎在没有扩展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建议使用具有超时的拦截器的想法。

猜你在找的Angularjs相关文章