当前位置: 首页 > article >正文

Axios 取消上一次重复请求

 Axios封装

import axios, {
  AxiosError,
  AxiosResponse,
  InternalAxiosRequestConfig,
  CancelTokenSource,
} from "axios";

const baseURL = "http://localhost:3000";

//创建axios实例
const service = axios.create({
  baseURL,
  timeout: 3000,
});

//添加请求拦截
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token: string | null = sessionStorage.getItem("token") || null;

    if (token) {
      config.headers["Authorization"] = token;
    }
    return config;
  },
  (error: AxiosError) => {
    //对请求错误做些什么
    console.log(error, "request-error");
    return Promise.reject(error);
  }
);

//添加响应拦截
service.interceptors.response.use(
  (response: AxiosResponse) => {
    //2XX范围内的状态码都会触发该函数
    //对响应数据做点什么
    return response.data;
  },
  (error: AxiosError) => {
    if (axios.isCancel(error)) {
      console.log("Request canceled", error.message);
    }
    //超出2xx范围的状态码都会触发该方法
    //对响应错误做点什么
    console.log(error, "response-error");
    const { response } = error;
    let message = "";
    const status = response?.status;
    switch (status) {
      case 401:
        message = "token失效,请重新登陆";
        break;
      case 403:
        message = "拒绝访问";
        break;
      case 404:
        message = "请求地址错误";
        break;
      case 500:
        message = "服务器故障";
        break;
      default:
        message = "网络连接故障";
    }

    console.log(message, "response-error-mag");
    return Promise.reject(error);
  }
);

export default service;

// 取消重复的上一次请求
const cancelTokens: { [key: string]: CancelTokenSource } = {};
export const createRequestWithCancelToken = (
  config: InternalAxiosRequestConfig,
  key = "default"
) => {
  if (cancelTokens[key]) {
    cancelTokens[key].cancel("Request canceled");
  }
  cancelTokens[key] = axios.CancelToken.source();
  return service({
    ...config,
    cancelToken: cancelTokens[key].token,
  });
};


// 使用
export const apiTest= params => {
  return createRequestWithCancelToken({
    url: 'api/test',
    method: 'get',
    params
  })
}


http://www.kler.cn/a/450188.html

相关文章:

  • Rust: offset祼指针操作
  • QT用Enigmavb 打包成单独exe
  • ROS1入门教程6:复杂行为处理
  • 初学stm32 --- 定时器中断
  • 关于卡尔曼滤波
  • 利用Gurobi追溯模型不可行原因的四种方案及详细案例
  • DELL EMC Unity 存储系统扩容之如何查看pool类型
  • Java 异常
  • Next.js 14 数据处理:从服务端组件到状态管理的最佳实践
  • Vue.js前端框架教程11:Vue监听器watch和watchEffect
  • MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
  • JAVA开发 在 Spring Boot 中集成 Swagger
  • 人的心理特征
  • PMO转型提升汽车销售效率:看板工具的关键作用
  • 关于 K8s 的一些基础概念整理-补充【k8s系列之二】
  • 石岩基督教福音堂
  • 【CryptoJS库AES加密】
  • 蓝牙协议——音乐启停控制
  • sward - 一款国产开源免费的企业级知识库管理工具
  • SOME/IP 协议详解——信息格式
  • 构建安全的用户认证系统:PHP实现
  • Ubuntu下通过Docker部署NGINX服务器
  • 如何实现一个充满科技感的官网(一)
  • kafka sasl和acl之间的关系
  • LeNet网络搭建
  • Linux SHELL脚本中的常用命令