Angular HTTP 请求自定义 timeout 值的一种实现思路

简介: Angular HTTP 请求自定义 timeout 值的一种实现思路

本文介绍 Angular HTTP 请求 timeout 的一种实现思路。的

如果不扩展 HttpClientModule 类,拦截器与相应请求进行通信的唯一预期方式是参数和标头对象。


image.png


由于超时值是标量(Scalar)的,它可以安全地作为自定义标头提供给拦截器,可以通过 RxJS 超时运算符(timeout Operator)来决定是默认超时还是特定超时。

代码片段如下:

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 = req.headers.get('timeout') || this.defaultTimeout;
    const timeoutValueNumeric = Number(timeoutValue);
    return next.handle(req).pipe(timeout(timeoutValueNumeric));
  }
}

上面代码里,timeout 是 rxjs 提供的一个 Operator.


DEFAULT_TIMEOUT 这个 injection token, 以及 HTTP Interceptor 的提供方式,定义在 App Module 中:


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



image.png


然后,我们就可以使用下面的代码来调用 HTTPClient,使用自定义的 timeout 值了:


http.get('/your/url/here', { headers: new HttpHeaders({ timeout: `${20000}` }) });

另外,Angular 的 proxy 设置里也允许定义 timeout 值:

{
  "/api": {
    "target": "http://localhost:3000",
    "secure": false,
    "timeout": 360000
  }
}



关于 rxjs 的 timeout Operator 的输入参数,首先需要知道的是,如果没有给配置提供 with 属性,当满足超时条件时,这个操作符会发出一个 TimeoutError。 相反,如果配置了 with 属性,Angular 将使用 with 提供的工厂函数,并将开发人员的订阅切换到其结果。 超时条件由 first 和 each 中的设置提供。


第一个属性可以是特定时间的日期、相对于订阅点的时间段的数字,也可以被跳过。 此属性仅用于检查来自源的第一个值到达的超时条件。 来自源的所有后续值的时间将根据每个提供的时间段进行检查(如果已提供)。


image.png

相关文章
|
5月前
|
JavaScript 前端开发
Angular.js 应用里如何发送 HTTP 请求
Angular.js 应用里如何发送 HTTP 请求
|
12月前
|
数据采集 搜索推荐 索引
Angular 服务器端渲染应用返回 HTTP 404 和 200 状态码对 SEO 的影响
Angular 服务器端渲染应用返回 HTTP 404 和 200 状态码对 SEO 的影响
|
缓存 JavaScript 中间件
使用 Angular HTTP_INTERCEPTOR 拦截器来记录超时请求的一些思考
使用 Angular HTTP_INTERCEPTOR 拦截器来记录超时请求的一些思考
|
5月前
|
缓存 JavaScript 中间件
如何在 Angular 应用中发起 HTTP 302 redirect
如何在 Angular 应用中发起 HTTP 302 redirect
Angular HTTP 请求自定义 timeout 值的一种实现思路
Angular HTTP 请求自定义 timeout 值的一种实现思路
|
存储 前端开发
Angular HTTPClient 发送请求的触发方式讨论
Angular HTTPClient 发送请求的触发方式讨论
|
JavaScript
使用 RxJS timeout 操作符给 Angular SSR 服务器端渲染模式下的 HTTP 请求添加超时机制
使用 RxJS timeout 操作符给 Angular SSR 服务器端渲染模式下的 HTTP 请求添加超时机制
|
缓存 监控 API
Angular 如何通过 HTTP Interceptor 实现 HTTP 请求的超时监控
Angular 如何通过 HTTP Interceptor 实现 HTTP 请求的超时监控
|
缓存 前端开发 JavaScript
AngularJs优雅取消正在执行的http请求
AngularJs优雅取消正在执行的http请求
79 0
AngularJs优雅取消正在执行的http请求
|
前端开发 JavaScript 编译器
Angular最新教程-第七节HTTP get post 设置头部 跨域访问
Angular最新教程-第七节HTTP get post 设置头部 跨域访问
475 0
Angular最新教程-第七节HTTP get post 设置头部 跨域访问