• axios进阶——取消已经发出去的请求


    首先,引入取消已经发出去的请求的必要性:

    1. 防止重复请求:当用户快速连续触发同一操作(比如多次点击按钮发送同一个请求),这个函数可以确保只有最后一个请求被执行,之前的相同请求会被取消,从而避免了因重复请求导致的数据不一致或服务器压力。

    2. 优化性能和体验:通过维护一个待处理请求的映射表(pendingMap),可以有效管理网络请求队列,特别是在用户交互频繁的应用中,有助于提升应用响应速度和用户体验。

    3. 资源管理:及时取消不再需要的HTTP请求可以释放浏览器或应用的资源,尤其是在移动端或网络环境不稳定的情况下,有助于节省数据流量和电池使用。

    解决方案:CancelToken是axios库提供的一种机制,允许你取消已发出但尚未完成的HTTP请求。

    具体用法:

    1. axios.CancelToken((cancel) => {
    2. cancel()
    3. });

    封装进入axios中,大体思路为:

    1. 构建一个Map数据结构

    2.每发送一个网络请求,就将该请求映射入Map结构中

    3.存入前进行检查,如果存在该映射关系,将旧的请求cancel()取消掉,将新的映射存入

    一、封装取消axios的类

    1. let pendingMap = new Map<string, Canceler>();
    2. export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&');
    3. export class AxiosCanceler {
    4. /**
    5. * Add request
    6. * @param {Object} config
    7. */
    8. addPending(config: AxiosRequestConfig) {
    9. // 取消相同的请求
    10. this.removePending(config);
    11. // 构造key
    12. const url = getPendingUrl(config);
    13. config.cancelToken =
    14. config.cancelToken ||
    15. new axios.CancelToken((cancel) => {
    16. if (!pendingMap.has(url)) {
    17. // If there is no current request in pending, add it
    18. pendingMap.set(url, cancel);
    19. }
    20. });
    21. }
    22. /**
    23. * @description: Clear all pending
    24. */
    25. removeAllPending() {
    26. pendingMap.forEach((cancel) => {
    27. cancel && isFunction(cancel) && cancel();
    28. });
    29. pendingMap.clear();
    30. }
    31. /**
    32. * Removal request
    33. * @param {Object} config
    34. */
    35. removePending(config: AxiosRequestConfig) {
    36. const url = getPendingUrl(config);
    37. if (pendingMap.has(url)) {
    38. // If there is a current request identifier in pending,
    39. // the current request needs to be cancelled and removed
    40. const cancel = pendingMap.get(url);
    41. cancel && cancel(url);
    42. pendingMap.delete(url);
    43. }
    44. }
    45. /**
    46. * @description: reset
    47. */
    48. reset(): void {
    49. pendingMap = new Map<string, Canceler>();
    50. }
    51. }

    二、封装axios(部分)

    1. import { AxiosCanceler } from './axiosCancel';
    2. this.axiosInstance = axios.create(options);
    3. const axiosCanceler = new AxiosCanceler();
    4. this.axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
    5. axiosCanceler.addPending(config);
    6. return config;
    7. }, undefined);

  • 相关阅读:
    线阵相机参数介绍之轴编码器控制
    Windows系统Mysql8版本的安装教程
    Servlet
    InfoQ 2022 年趋势报告:人工智能、机器学习和数据工程篇
    IMX6ULL学习笔记(8)——获取和编译Linux内核
    类继承关系梳理
    LeetCode-481. 神奇字符串【双指针,字符串】
    【微电网重构】基于粒子群算法实现IEEE33节点系统进行配电网重构 前推回代计算潮流附matlab代码
    Mybatis-Plus ActiveRecord
    音视频网络冗余策略
  • 原文地址:https://blog.csdn.net/liushihao_/article/details/139656383