如何使用Angular设置HttpHandler的超时时间?

沙吞

我正在尝试使用Angular5设置HTTP请求的最大超时,这是基于发现的内容:

@Injectable()
export class TokenInterceptor implements HttpInterceptor {
  constructor(private tokenService:TokenService) {}
  /**
   * This method will add the Authorization header on each API request
   * @param request 
   * @param next 
   */
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (request.url.includes('/api/')) {
      request = request.clone({ setHeaders: { Authorization: 'Bearer ' + this.tokenService.getToken() } });
      return next.handle(request).timeout(1, Observable.throw("Request timed out"));
    }
    return next.handle(request);
  }
}

除了说 timeout does not exist on type Observable<HttpEvent<any>>

如何设置请求超时?

TrystanHumann

注意:我还没有找到延长超时的方法,但这可以让您将超时编辑为比默认的2分钟短。如果您要在后端上发布一些内容,需要花费2分钟以上的时间进行处理,则应提醒客户端您有数据,并在尝试处理该数据,而不是尝试延长超时时间。

以下是缩短超时的方法:

在您的应用程序模块内部,您应该创建具有自定义超时(以毫秒为单位)的拦截器。

import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { TimeoutError } from 'rxjs/util/TimeoutError';
import 'rxjs/add/operator/timeout';
import { InjectionToken, Injectable, Inject } from '@angular/core';
import { HttpHandler, HttpRequest, HttpInterceptor, HttpEvent } from '@angular/common/http';

const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');
const defaultTimeout = 5000;

@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);
  }
}

将此添加到您的提供商列表:

[{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
[{ provide: DEFAULT_TIMEOUT, useValue: defaultTimeout }]

发出请求时,您要添加使用拦截器的自定义标头,如下所示:

const options = {
    headers: new HttpHeaders({ timeout: `${3600000}` }),
    params: params,
    reportProgress: true,
    Timeout: 5000
};

现在,当您发出的请求达到5000毫秒超时时,它应该停止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章