Vue切换页面时中断axios请求

摘要:
一、概述在Vue单页面开发过程中,遇到这样的情况,当我切换页面时,由于上一页面请求执行时间长,切换到该页面时,还未执行完,这时那个请求仍会继续执行直到请求结束,此时将会影响页面性能,并且可能对现在页面的数据显示造成一定影响所以我们应该,切换页面前中断前面所有请求二、解决方法在main.js中,重新封装axios请求,在router.beforeEach强制中断请求Vue.prototype.$ht

一、概述

在Vue单页面开发过程中,遇到这样的情况,当我切换页面时,由于上一页面请求执行时间长,切换到该页面时,还未执行完,这时那个请求仍会继续执行直到请求结束,此时将会影响页面性能,并且可能对现在页面的数据显示造成一定影响

所以我们应该,切换页面前中断前面所有请求

二、解决方法

在main.js中,重新封装axios请求,在router.beforeEach强制中断请求

Vue.prototype.$http= axios;
//Vue函数添加一个原型属性$axios 指向axios,这样vue实例或组件中不用再去重复引用Axios 直接用this.$axios就能执行axios 方法
const CancelToken =axios.CancelToken;
Vue.$httpRequestList=[];

Vue.prototype.$ajax = (type, url, data) =>{
    return new Promise((resolve, reject) => {   //封装ajax
        var aa ={
            method: type,
            url: url,
            cancelToken: new CancelToken(c => {  //强行中断请求要用到的
Vue.$httpRequestList.push(c);
            })
        }
        var json = (type == 'get') ?Object.assign(aa, { params: data }) : Object.assign(aa, { data: data });
        var ajax = Vue.prototype.$http(json).then(res =>{
            resolve(res);
        }).catch(error => {   //中断请求和请求出错的处理
                if (error.message == "interrupt") {
                    console.log('已中断请求');
                    return;
                } else{
                    reject(error);
                }
            })
        returnajax;
    })
};


router.beforeEach((to, from, next) => {   //路由切换检测是否强行中断,
    if(Vue.$httpRequestList.length>0){        //强行中断时才向下执行
        Vue.$httpRequestList.forEach(item=>{
            item('interrupt');//给个标志,中断请求
})  
    }
    next();    
});

使用请求

this.$axios('get',url,param).then(res=>{

}).catch(err=>{

});

三、分析解读

axios中文官网(http://www.axios-js.com/zh-cn/docs/)对cancel token 的说明

使用cancel token取消请求

方法一、使用cancelToken.sourse工厂方法创建cancel token

const CancelToken =axios.CancelToken;
const source =CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if(axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else{
     //处理错误
}
});
axios.post('/user/12345', {
  name: 'new name'}, {
  cancelToken: source.token
})
//取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

方法二、通过传递一个 executor 函数到CancelToken的构造函数来创建 cancel token:

const CancelToken =axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(functionexecutor(c) {
    //executor 函数接收一个 cancel 函数作为参数
    cancel =c;
  })
});

//cancel the request
cancel();

免责声明:文章转载自《Vue切换页面时中断axios请求》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇su sudo 限制root远程登录《编程珠玑》第一章下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue组件封装成npm包

以我自己封装的一个npm包为例,用于音频打点切分,展示音频波形图,波形图选区播放等,如下图: 传送门: npm:https://www.npmjs.com/package/audio_wave_plugin github源码:https://github.com/panxiaoxiao0823/audio_wave_plugin 封装过程: 1.初始化vu...

vue中el-upload上传多图片且携带参数,批量而不是一张一张的解决方案

现在前端基本不是vue技术栈就是react技术栈。 vue技术栈最常用的就是element-ui的ui框架了。 在项目中,我们经常会碰到这种需求:批量上传文件 element-ui 确实也为我们提供了<el-upload>这样的组件,同事也暴露了很多的属性和方法供我们使用。 但是很多人却碰到了这样的问题:项目需求是批量上传,但是为什么自己上传的...

vue之文本渲染

Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是{{}}的形式渲染文本,但是除此方法之外,vue还提供了其他几种常见的文本渲染方式: v-text:更新元素的innerText v-html:更新元素的in...

vuex页面刷新数据丢失的解决办法

在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失。 原因: 因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值初始化 解决思路: 将state的数据保存在localstorage、sessionstorage或cookie中(三者...

vue 数组push元素 视图没更新

Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下: push() pop() shift() unshift() splice() sort() reverse() 问题描述:在tap栏下,给每个tab添加一行数据,默认行就可以一直添加,切换到1号的tab添加时,数组已经添加成功,但是视图就是没有变化,来回切换才手动更新 ...

Vue--爬坑

1.路由变化页面数据不刷新问题; 出现这种情况是因为依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个文章页面并不会运行created组件生命周期,导致文章数据还是第一次进入的数据。 解决方法:watch监听路由是否变化 解决方法:watch监听路由是否变化 watch: {...