资讯专栏INFORMATION COLUMN

axios重复点击取消上一次请求封装

马永翠 / 1792人阅读

摘要:使用场景重复点击或者多标签使用一个视图等当然也可以用加载中或者透明背景禁止请求中再次点击封装代码来自于互联网声明一个数组用于存储每个请求的取消函数和标识当当前请求在数组中存在时执行函数体执行取消操作请求拦截器在一个发送前执行一下取消操作这里

使用场景

重复点击或者多tab标签使用一个视图等(当然也可以用加载中或者透明背景禁止请求中再次点击)

封装代码

来自于互联网

let pending = []; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
let removePending = (config) => {
    for(let p in pending){
        if(pending[p].u === config.url + "&" + config.method) { //当当前请求在数组中存在时执行函数体
            pending[p].f(); //执行取消操作
            pending.splice(p, 1); 
        }
    }
}



// http请求拦截器
axios.interceptors.request.use(config => {

    removePending(config); //在一个axios发送前执行一下取消操作
    config.cancelToken = new cancelToken((c)=>{
        // 这里的axios标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式
        pending.push({ u: config.url + "&" + config.method, f: c });  
    });
    
    return Promise.resolve(config)
}, error => {
    return Promise.reject(error)
})

// http响应拦截器
axios.interceptors.response.use(data => { 
    
    removePending(data.config);  //在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除
    
    return Promise.resolve(data)
    
}, error => {
    //加载失败
    return {"data":{}}
    // return Promise.reject(error)
})

经过多次测试发现不同请求也给我取消了,原因是没有校验请求参数,也就是说get请求可以用,修改以下代码

pending.push({ u: config.url + "&" + config.method, f: c }); 

修改为:

pending.push({ u: config.url + JSON.stringify(config.data) +"&" + config.method, f: c });//config.data为请求参数

上面判断也需要修改,这样get请求和post都可以用了

解决分析

(个人理解)
官方提供了axios.CancelToken来取消上一次请求方法,因此只需要判断上一次请求是否重复。声明数组变量 pending用于存储每个请求实例的axios标识(请求方式,请求参数,请求url)和该实例的取消函数;在请求拦截器中创建取消函数实例,将请求的标识(判断重复标识)及 该请求实例取消函数 pushpending数组中,创建取消上一次请求方法 removePending,该方法主要判断axios请求标识是否重复,重复则执行该实例的取消函数,并且从 pending中移除标识及该实例取消函数。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104829.html

相关文章

  • axios基于常见业务场景的二封装(更新)

    摘要:时隔一年再次更新下根据项目下常见业务场景对的二次封装功能实现兼容浏览器避免缓存减少或更新重复请求接口域名使用环境变量全局状态可关闭的全局错误提醒可开启携带全局分页参数拦截器请求拦截器请求开始请求出错响应拦截器请求结束请求错误处理网络请求中, 时隔一年再次更新下根据vue项目下常见业务场景对axios的二次封装 功能实现:1.兼容ie浏览器避免缓存2.减少或更新重复请求3.接口域名使用环...

    dailybird 评论0 收藏0
  • 封装axios,根据参数来实现多个请求拦截

    摘要:新建文件,设置请求拦截和处理的逻辑取消请求设置默认请求头,如果不需要可以取消这一步请求超时的时间限制开始设置请求发起的拦截处理代表发起请求的参数的实体得到参数中的字段,用于决定下次发起请求,取消对应的相同字段的请求如果没有就默认添加一个 1. 新建 axiosTool.js 文件,设置请求拦截和处理的逻辑 import Vue from vue import axios from ax...

    MoAir 评论0 收藏0
  • 封装axios,根据参数来实现多个请求拦截

    摘要:新建文件,设置请求拦截和处理的逻辑取消请求设置默认请求头,如果不需要可以取消这一步请求超时的时间限制开始设置请求发起的拦截处理代表发起请求的参数的实体得到参数中的字段,用于决定下次发起请求,取消对应的相同字段的请求如果没有就默认添加一个 1. 新建 axiosTool.js 文件,设置请求拦截和处理的逻辑 import Vue from vue import axios from ax...

    gclove 评论0 收藏0
  • axios基于常见业务场景的二封装

    摘要:是一个基于的库,可以用在浏览器和中。我在最近的几个项目中都有使用,并基于根据常见的业务场景封装了一个通用的服务。业务场景全局请求配置。请求携带,权限错误统一管理。 axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络请求库。我在最近的几个项...

    JasinYip 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<