vue项目created()被调用多次的坑
admin
2024-03-19 10:44:37
0

一、问题描述

最近碰到一个奇怪的生产问题:
正常情况下、前端页面会请求一次后台、然后后台返回信息("处理成功""处理失败")、前端展示;
后台用aop+redis写了一个防止重复调用的方法,如果5s内同一个用户重复调用同一个接口,就返回"请勿重复调用",前端就会展示这个。

但是,某几个页面,前端总是会重复调用后端2次,导致用户只能看到"请勿重复调用",无法确认本次操作是成功还是失败,严重影响了用户的正常使用。(虽然是处理成功,但是显示不出来…)

一开始还怀疑是不是后端的问题,排查了半天,终于锁定了,是前端的问题,vue项目中的created()方法被调用了2次

继续排查,发现从正常页面跳转到这个问题页面时,确实只跳转了1次,按理说created()方法应该也只触发1次的,但是就是不知道为什么触发了2次。

二、排查过程

1.从头开始排查前端项目,vue项目首先会加载main.js,发现这个文件里有:

import Vcon from './assets/js/vcon'new Vcon({env: ENV
}, () => {new Vue({router,render: h => h(App)}).$mount('#app')
})

发现这个文件里,并不是普通的使用new Vue()创建的页面,而是外面有封装了一个new Vcon()方法,并传了2个参数,其中第一个参数是{ env: ENV },第二个参数是 () => { new Vue({ router, render: h => h(App) }).$mount('#app') }

2.继续,查看./assets/js/vcon.js文件,发现这个文件里有类似这样的:

class Vcon {constructor (opt, callBack) {this.env = opt.env || '' // 记录代码环境this.callBack = callBack // 记录回调函数// 如果是生产环境if (this.env !== 'test') {this.prodInit()typeof this.callBack === 'function' && this.callBack()return}// 如果是测试环境if (this.env === 'test') {this.testInit()return}}testInit () {import('vconsole').then(({ default: VConsole }) => {new VConsole()console.log('测试vconsole加载完成')typeof this.callBack === 'function' && this.callBack()})}prodInit () {let _that = thiswindow.ISALES.callApp('getUserInfoByNative', {callback: function (userInfo) {if (userInfo.code === '0') {_that.betterStaffNUmber = userInfo.msg.staffNumber_that.betterHandler(userInfo)return}alert('获取sdk出错,请稍后再试')}})}betterHandler (userInfo) {if (userInfo.msg.userCode == 'admin') {import('vconsole').then(({ default: VConsole }) => {new VConsole()console.log(`admin的vconsole加载完成`)typeof this.callBack === 'function' && this.callBack()})return}else{this.callBack()}}}

其中,当上一步执行new Vcon()时,实际执行的就是这里的constructor ()方法;
如果是测试环境,那就执行testInit ()方法,这个还是比较明显的,用来展示vconsole(测试环境一直正常,没有复测出来问题);
如果是生产环境,那就执行prodInit()方法,然后执行typeof this.callBack === 'function' && this.callBack()方法(这里感觉有些问题,先继续看);

prodInit()方法里,会执行window.ISALES.callApp方法,这个是个sdk方法(这个前端项目是vue项目,可以打包后把静态页面部署在服务器上;sdk方法是app和ios里的方法,前端只能这样才能调用到、待sdk方法处理完后会触发callback方法);

sdk方法中,会执行betterHandler()方法,意思是,如果当前app/ios的登录人是admin,那就显示vconsole,否则就不显示。

3.根据生产created()方法被调用2次、而测试正常的现象,排查到问题方法位置:

    // 如果是生产环境if (this.env !== 'test') {this.prodInit()typeof this.callBack === 'function' && this.callBack()return}

因为prodInit()方法的逻辑中,正常情况下,已经调用过一次typeof this.callBack === 'function' && this.callBack()了,然而执行完prodInit()方法后,又会调用一次typeof this.callBack === 'function' && this.callBack(),所以才导致created()方法被重复调用了2次。

4.正确代码如下:

    // 如果是生产环境if (this.env !== 'test') {this.prodInit()//这里导致了重复created()//typeof this.callBack === 'function' && this.callBack()return}

修改后,发布生产,终于恢复了正常。

三、备注

1.vue项目中,有时会自动优化代码格式,导致if后面没有大括号、只有1句,满足条件就执行、不满足就不执行,需要注意。

2.有时,if没有else,而是if中结尾有个return,此时也类似else,但是容易忽略,需要注意。(这个也是自动优化格式的?还是故意写的难懂了?)

3.typeof this.callBack === 'function' && this.callBack(),这个的意思是,如果this.callBackfunction类型的,那就会执行后面的this.callBack()方法,然后继续下一步;如果不是function类型的,那就不执行后面的方法,直接继续下一步。(又一个不好理解的高级写法,用if不好吗?)

4.正常情况下,vue页面的created()方法会在页面初始化的时候执行1次;但是如果代码有问题,就会导致created()方法会在页面初始化的时候执行2次或多次(如本文),这个坑需要注意。

相关内容

热门资讯

原创 清... 清晨的阳光透过窗帘缝隙洒进厨房,玻璃杯上凝结的水珠缓缓滑落。冰箱门打开的瞬间,冷气裹挟着奶香扑面而来...
见识了预制米饭里的黑科技,打工... “大米,水。” 我再三确认了配料表,“常温保存9个月?” 等等,这合理么? 面对手里写着“鲜米饭”...
天热这么吃鸭,清爽解腻,真有一... 大部分人喜欢吃鸭子,鸭肉性寒,清热养胃,很适合燥热的吃货们,尤其是火气旺,容易上火的。 于是乎就有了...
原创 厨... 清晨的阳光透过纱帘洒进厨房,铸铁锅在灶台上微微冒着热气。记得小时候,每当外婆开始准备早餐,整个屋子都...
原创 一... 晨光中的米香 清晨的阳光透过厨房的纱帘,在灶台上投下斑驳的光影。电饭煲的蒸汽孔正缓缓吐出白色的雾气...
文化中国行|徐州淮海战役纪念馆... 现代快报讯(记者 张晓培 文/摄)盛夏的徐州,烈日炙烤着大地,热浪在空气中不断翻涌,可游客们的热情却...
【温馨提示】房山区启动防汛三级... 2025年7月27日11时房山区已启动防汛三级应急响应,为保障市民游客安全,目前,房山区周口店遗址、...
一家人去北京5日攻略费用,北京... 北京,这座古老与现代交织的城市,以其丰富的历史文化遗产和现代化的都市风貌吸引着无数游客的目光。从宏伟...
四川结伴自由行五天导游推荐,成... 四川,这片位于中国西南的神奇土地,自古以来就是人文与自然景观交相辉映的宝地。从巍峨的雪山到蜿蜒的江河...
情侣到四川玩五天花多少钱,组团... 四川,这片位于中国西南的神奇土地,以其独特的自然风光、悠久的历史文化和丰富的民族风情而闻名遐迩。从成...
跟团去北京4天3晚多少钱,北京... 北京,这座古老而现代交织的城市,不仅是中国的政治文化中心,更是一座充满历史韵味与现代活力的国际大都市...
和父母去四川5日游详细攻略,成... 自从有了孩子,我们的旅行计划就总是围绕着“亲子”这个主题展开。四川,这个充满自然美景和人文底蕴的地方...
四川旅游4天3晚报团多少钱,成... 宝子们,四川,这片充满魅力的土地,宛如一幅绚丽多彩的画卷,在祖国的西南地区徐徐展开。它有着“天府之国...
四川旅游5天攻略,去成都5天4... 四川,这片古老而又充满活力的土地,宛如一颗镶嵌在中国西南的璀璨明珠,散发着独特的魅力。它既有“蜀道之...
北京五日游跟团攻略,报团去北旅... 在旅游热潮不断升温的当下,北京作为中国的首都,凭借着深厚的历史文化底蕴、壮丽的名胜古迹以及繁华的都市...
定制白酒出货 这是(li460220)整理的信息,希望能帮助到大家 在白酒行业中,出货量的稳定增长不仅关系到企业的...
原创 孩... 锅贴,大家应该都吃过吧?很多人觉得锅贴和饺子差不多,其实它们的口感完全不一样。锅贴最吸引人的地方,就...
广元美食攻略全收录 广元,位于四川省东北部,素有“天府之国的东大门”之称,不仅拥有丰富的自然资源和深厚的文化底蕴,还因其...
“盛世中国•艺术茅台”——书法... 特邀名家 潘军 潘军:男,一九五0年出生,中学高级教师【副高】。 艺术珍藏酒 ▲献礼华诞 ...