vue项目中路由切换时取消所有等待中的请求

场景

使用vue构建的app页面,切换路由时,存在卡顿现象。经分析,较大原因是,上个页面中的axios请求未结束,特别是某个存在多个请求的页面,会在该页面停留较长时间(所有请求结束)才会切换到目标页面。

思路

路由切换时取消所有未完成的axios请求。

实现

参照axios的api,可以使用cancel token来取消请求。

首先,为达到统一处理,在main.js中添加请求拦截器:

let axiosPromiseArr=[] //储存cancel token
axios.interceptors.request.use(function (config) {
    // 在发送请求设置cancel token
    config.cancelToken = new axios.CancelToken(cancel => {
        axiosPromiseArr.push({cancel})
    })
    return config;
}, function (error) {
    // 对请求错误的处理
    return Promise.reject(error);
});
复制代码

其次,路由切换时,取消axiosPromiseArr中所有未完成的请求,也是main.js:

router.beforeEach((to, from, next) => {
    axiosPromiseArr.forEach((ele, index) => {
        ele.cancel()
        delete axiosPromiseArr[index]
    })
}
复制代码

最后,添加响应拦截器(具体位置根据项目中,拦截器位置而定):

axios.interceptors.response.use(response => {
    //请求成功时的处理
}, error => {
    //请求取消时,也会进入error,根据axios.isCancel():true--请求取消  false--请求失败
    //仅在请求失败时做后续处理
    if(axios.isCancel(error)) {
        console.log('请求取消')
    }else {
        Toast({
            message: '连接服务器失败,请稍后再试!',
            duration: 2000,
            className: 'globalMsg'
        });
        return Promise.reject(error);
    }
});
复制代码

ps:第一次写文章,不足之处,请指正。顺便立个flag:2018年9月26日15:12:42,记录人生第一次[羞涩]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值