电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

vue路由切換時取消之前的所有請求操作

瀏覽:125日期:2022-12-01 14:59:27

在main.js文件里

import router from ’router/’;import Vue from ’vue’;Vue.Cancel = [];router.beforeEach((to, from, next) => { while (Vue.Cancel.length > 0) { Vue.Cancel.shift()(’cancel’); } next();})

ajax文件

import Vue from ’vue’;import axios from ’axios’;import VueAxios from ’vue-axios’;Vue.use(VueAxios, axios);// 導入封裝的回調函數(shù)import { cbs, gbs} from ’config/’;// 動態(tài)設置本地和線上接口域名Vue.axios.defaults.baseURL = gbs.host;/** * 封裝axios的通用請求 * @param {string} type get或post * @param {string} url 請求的接口URL * @param {object} data 傳的參數(shù),沒有則傳空對象 * @param {object} urlParams url傳參 * @param {Function} fn 回調函數(shù) * @param {boolean} tokenFlag 是否需要攜帶token參數(shù),為true,不需要;false,需要。一般除了登錄,都需要 */export default function ({ type, path, data, params, urlParams, fn, errFn, tokenFlag, headers, opts} = {}) { var options = { method: type, url: path, params: params, headers: headers && typeof headers === ’object’ ? headers : {}, cancelToken: new axios.CancelToken(function (cancel) { Vue.Cancel && Vue.Cancel.push(cancel) }) }; //檢測接口權限 var api_flag = true; if (options.url && options.url.indexOf(gbs.host) && this.$store.state.user.userinfo.access_status === 1) { var url = options.url.replace(gbs.host, ’’); var api_routers = this.$store.state.user.userinfo.api_routers; if (!api_routers || !api_routers.constructor === Object || !api_routers[url]) { api_flag = false; } } var urlParamsArray = []; if (api_flag === true) { options[type === ’get’ ? ’params’ : ’data’] = data; // 用于url傳參 if (typeof (urlParams) == 'object') { for (var k in urlParams) { urlParamsArray.push(k + ’=’ + urlParams[k]) } options.url += ’?’ + urlParamsArray.join(’&’); } if (typeof (urlParams) == 'string' || typeof (urlParams) == 'number') { options.url += urlParams; } if(options.url.indexOf(’?’) > -1){ options.url += ’&_=’ + (new Date()).getTime(); }else{ options.url += ’?_=’ + (new Date()).getTime(); } // 分發(fā)顯示加載樣式任務 this.$store.dispatch(’show_loading’); if (tokenFlag !== true) { //如果你們的后臺不會接受headers里面的參數(shù),打開這個注釋,即實現(xiàn)token通過普通參數(shù)方式傳 // data.token = this.$store.state.user.userinfo.token; options.headers.token = this.$store.state.user.userinfo.token; } //擴展Promise使支持finally(),用了babel就不用手寫了^.^ // Promise.prototype.finally=function(callback){ // let Promise = this.constructor; // return this.then( // value => Promise.resolve(callback()).then(() => value), // reason => Promise.resolve(callback()).then(() => { throw reason }) // ); // }; //發(fā)送請求 return new Promise((resolve, reject)=>{ Vue.axios(options).then((res) => { this.$store.dispatch(’hide_loading’); if (res.data[gbs.api_status_key_field] === gbs.api_status_value_field || (res.status === gbs.api_status_value_field && !res.data[gbs.api_status_key_field])) { fn(res.data); } else { if (gbs.api_custom[res.data[gbs.api_status_key_field]]) { gbs.api_custom[res.data[gbs.api_status_key_field]].call(this, res.data); } else { cbs.statusError.call(this, res.data); if (errFn) { errFn.call(this, res.data); } } } resolve(res.data); }).catch((err) => { if(err.response && err.response.status !== 403){ try{ errFn?errFn.call(this, this.$$lib__.isObject(err.response.data) ? err.response.data : {}):null; }catch(err){ console.error(err.message); } } if(err.response && err.response.data === ’’){ cbs.statusError.call(this, {status: err.response.status}); } else if (err.response && this.$$lib__.isObject(err.response.data)) { cbs.statusError.call(this, err.response.data); }else if(err.response){ cbs.requestError.call(this, err); } else { console.error(’Error from ’, ’'’+path+’'.’, err.message); } reject(err); }); }); } else { this.$alert(’您沒有權限請求該接口!’, ’請求錯誤’, { confirmButtonText: ’確定’, type: ’warning’ }); }};

核心代碼為cancelToken參數(shù)

var options = { method: type, url: path, params: params, headers: headers && typeof headers === ’object’ ? headers : {}, cancelToken: new axios.CancelToken(function (cancel) { Vue.Cancel && Vue.Cancel.push(cancel) }) };

補充知識:problem:vue組件局部刷新,在組件銷毀(destroyed)時取消刷新無效問題

場景:

一個群發(fā)消息列表(數(shù)組)

列表下有多條消息(元素)

每條正在發(fā)送的消息數(shù)據(jù)狀態(tài)需要實時刷新,發(fā)送完成時需要顯示成功提示符合且不需要刷新,然后3秒消失。首次顯示列表時,已經成功的狀態(tài)不顯示這個成功提示符。

1、定位確定采用局部刷新

2、進入消息列表請求獲取列表數(shù)據(jù)的接口,完成發(fā)送的消息不需顯示完成狀態(tài)

3、正在發(fā)送的消息首次渲染時就調用setTimeout輪詢刷新當前消息的接口,完成時,顯示完成狀態(tài)(新增一個完成狀態(tài)的字段)

4、頁面銷毀時,還在發(fā)送的消息也取消刷新

誤區(qū):

1、每條消息沒有抽成一個單獨的組件,想要首次渲染組件調用刷新接口時,只能通過定義全局map變量來映射每條消息的刷新接口的定時器,明顯增加業(yè)務開發(fā)的復雜度,增加了一些不確定性的bug風險。

每條消息抽成組件之后,就可以在組件中的mounted中去調用刷新的接口,頁面銷毀時取消刷新可以在destroyed里面去銷毀。

2、這里的一個誤區(qū)是在destroyed里面去清除定時器的id,導致調用了destroyed鉤子刷新的定時器還是無法清除。將定時器id當做一個屬性值存在了每條數(shù)據(jù)所屬的對象中,然后在子組件(每條消息所屬的)中的destroyed中去讀取該對象的當前的定時器屬性,因為讀出來是undifined,其實并沒有拿到當前消息正在執(zhí)行的定時器,所以清除不掉。

組件使用有誤,每一個組件都是一個獨立的元素,其中定義的變量也是私有的,定時器id定在當前組件的data中就可以了,不需要再在數(shù)組中的每一條消息中定一個專屬的定時器id。

抽象出來的簡單版刷新數(shù)據(jù),5秒后取消刷新。

let intervalId = nullfunction init() { this.refresh()}function refresh() { intervalId = setTimeout(() => { this.getRefreshData() }, 2000);}function getRefreshData() { console.log(’start get data.....’, intervalId) setTimeout(() => { console.log(’get data.....’) this.refresh() }, 100); }function stopRefresh() { console.log(’stop....’, intervalId) clearInterval(intervalId)}this.init()setTimeout(() => { this.stopRefresh()}, 5000);

以上這篇vue路由切換時取消之前的所有請求操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 无线对讲-无线对讲系统解决方案-重庆畅博通信 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 橡胶接头_橡胶软接头_可曲挠橡胶接头-巩义市创伟机械制造有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 云南成人高考网| 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 顺辉瓷砖-大国品牌-中国顺辉| 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 南京租车,南京汽车租赁,南京包车,南京会议租车-南京七熹租车 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 |