同一个接口,掉n次,取消上次请求

关于在同一个接口连续调用两次时,取消上一次的请求。这通常是为了防止重复请求导致的数据不一致或性能问题。首先,我需要查看用户提供的代码文件,找到处理请求的部分,通常是axios的配置。

在用户提供的request.js中,主要使用axios创建了一个service实例,并配置了请求和响应拦截器。为了实现取消请求的功能,我需要引入axios的CancelToken。每次发起请求时,生成一个唯一的cancel token,并将前一个请求的cancel函数保存起来,以便在下次请求时取消之前的。

接下来,我需要确定在何处存储cancel函数。可以使用一个Map对象来保存每个接口的cancel函数,这样不同的接口之间不会互相干扰。当发起新的请求时,检查Map中是否存在该接口的pending请求,如果存在,则调用cancel方法取消,并移除旧的记录。

然后,在请求拦截器中,为每个请求添加cancel token,并将cancel函数存入Map。同时,在响应拦截器中,无论请求成功还是失败,都需要从Map中移除对应的记录,避免内存泄漏。

需要注意的是,用户现有的代码中已经处理了请求的序列化和token的添加,所以修改时不能影响原有功能。另外,要确保取消请求的逻辑不会干扰到其他接口,只针对同一个接口的连续调用。

最后,测试一下修改后的代码是否能在第二次调用时正确取消前一次请求,同时不影响其他正常流程,比如错误处理和响应数据的返回。

在Axios中实现取消重复请求的功能,可以通过CancelToken来处理。以下是修改后的核心代码片段:

javascript 复制代码
request.js
Apply
// 创建axios实例
const service = axios.create({
  // ... 原有配置 ...
})

// 存储pending请求的Map
const pendingRequests = new Map();

// request拦截器
service.interceptors.request.use(config => {
  // 生成唯一标识
  const requestKey = `${config.method}-${config.url}`;
  
  // 如果存在重复请求,取消前一个
  if (pendingRequests.has(requestKey)) {
    const cancel = pendingRequests.get(requestKey);
    cancel(requestKey);
    pendingRequests.delete(requestKey);
  }

  // 创建新的CancelToken
  config.cancelToken = new axios.CancelToken(cancel => {
    pendingRequests.set(requestKey, cancel);
  });

  // ... 原有代码(token处理、参数序列化等) ...
  return config
}, error => {
  Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
  // 请求完成时移除pending记录
  const requestKey = `${res.config.method}-${res.config.url}`;
  pendingRequests.delete(requestKey);
  
  // ... 原有响应处理代码 ...
}, error => {
  // 如果是主动取消的请求,不报错
  if (axios.isCancel(error)) {
    console.log('Request canceled:', error.message);
    return Promise.reject({ type: 'cancel' });
  }
  
  // ... 原有错误处理代码 ...
})

主要修改点:

  1. 新增pendingRequests用于存储进行中的请求
  2. 在请求拦截器中添加取消逻辑,使用「请求方法+URL」作为唯一标识
  3. 在响应拦截器中清除已完成请求的记录
  4. 对取消的请求进行特殊处理,避免触发错误提示

该实现会针对同一个接口的重复请求(相同method和URL),自动取消前一次未完成的请求。最后一次请求会被正常发送,之前的相同请求会被取消。

相关推荐
崔庆才丨静觅18 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606118 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了18 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅19 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅19 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅19 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment19 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅20 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊20 小时前
jwt介绍
前端
爱敲代码的小鱼20 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax