基于 TS 实现 axios(七)

本文介绍如何在 TypeScript 中实现 Axios 的取消请求功能,以避免在用户快速输入搜索时导致多个请求并发,确保请求的正确性和顺序。通过修改相关文件并引入取消令牌,确保后续请求能取消未完成的前一个请求,从而防止数据混乱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一章节,主要是写取消请求

目录:

在这里插入图片描述

取消请求

有些场景下,我们希望能主动取消请求,比如常见的搜索框案例,在用户输入过程中,搜索框的内容也在不断变化,正常情况每次变化都应该向服务器发送一次请求,但在当用用户输入过快的时候,我们不希望每次变化请求都发出去,通常一个解决方案是前端用 debounce 的方案,比如延时 200 ms 发送请求,这样当用户连续输入的字符,只要输入间隔小于 200 ms,前面输入的字符都不会发请求。但是还有一种极端情况下,后端接口很慢,比如超过1s才能响应,这个时候即使多了 200ms 的debounce,但是在我慢慢输入(每个输入间隔超过200ms)的情况下,在前面的请求没有响应前,也有可能发出多个请求,因为接口的响应时长是不定的,如果先发出去的请求响应时比后出发的请求要久一些,后请求的响应先回来,现请求的响应后回来,就会出现起请求响应结果覆盖后面请求的响应结果的情况,那么就乱了。因此在这个情况下,我们除了做 debounce,还希望后面的请求发出去的时候,如果前面的请求还没有响应,我们可以把前面的请求取消。

我修改了 axios.ts 文件

// ...
import CancelToken from './cancel/CancelToken
### 使用 TypeScript 封装 Axios 为了简化 HTTP 请求处理并提高项目的可维护性和类型安全性,在项目中可以创建一个自定义的 Axios 实例[^1]。 #### 创建 Axios 实例 通过 `axios.create` 方法来初始化一个新的 Axios 实例,并配置基础 URL 和其他默认设置: ```typescript import axios, { AxiosInstance } from 'axios'; const apiClient: AxiosInstance = axios.create({ baseURL: 'https://api.example.com/v1', timeout: 5000, }); ``` 这使得每次调用 API 接口时无需重复指定相同的参数,同时也方便全局修改这些选项。 #### 添加请求和响应拦截器 利用 Axios 提供的拦截功能可以在请求发出前或接收到响应后执行特定逻辑。例如,可以在请求头中自动加入认证令牌,或者统一处理错误消息[^2]。 ```typescript // 请求拦截器:用于添加 token 或显示加载状态 apiClient.interceptors.request.use( (config) => { const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error), ); // 响应拦截器:集中管理异常情况下的提示信息 apiClient.interceptors.response.use( response => response.data, error => { if (!error.response) { throw new Error('网络连接失败,请稍后再试!'); } switch (error.response.status) { case 401: throw new Error('未授权访问,请登录后重试!'); default: throw new Error(`服务器发生错误(${error.response.statusText})`); } }, ); ``` 上述代码片段展示了如何在发送请求之前检查是否存在有效的身份验证令牌以及如何优雅地捕获并解释来自服务器的不同类型的错误反馈。 #### 定义服务接口函数 最后一步是基于这个增强过的 Axios 实例构建具体的服务方法,以便于业务层直接调用而不需要关心底层实现细节: ```typescript interface UserResponseData { id?: number; name: string; } class UserService { static async fetchUser(userId: number): Promise<UserResponseData> { try { const result = await apiClient.get(`/users/${userId}`); return result as unknown as UserResponseData; } catch (e) { console.error(e.message); // 自定义错误处理方式 throw e; } } } ``` 这样不仅提高了代码复用率还增强了系统的健壮性,因为所有的 HTTP 调用都被集中在一处管理和控制之下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值