当前位置: 首页 > news >正文

将自己做的网站发布到网上西安网站建设推广专家

将自己做的网站发布到网上,西安网站建设推广专家,亚马逊网站怎么做推广,wordpress调用文章简介需求背景: 页面中需要展示柜子,一个柜子需要调用 详情接口以及状态接口 也就是说有一个柜子就需要调用两个接口,在项目初期,接手的公司项目大概也就4-5个柜子,最多的也不超过10个,但是突然进来一个项目&a…

需求背景:

页面中需要展示柜子,一个柜子需要调用 详情接口以及状态接口

也就是说有一个柜子就需要调用两个接口,在项目初期,接手的公司项目大概也就4-5个柜子,最多的也不超过10个,但是突然进来一个项目,这个项目中有 TM 300多台柜子,所以第一次渲染的时候,同时向服务器请求了600多个接口,导致接口超时,服务也挂了,主要也没想到会存在这种情况,咱也没遇到过啊,ok,既然问题来了,咱就解决问题

我一开始的代码逻辑就是先获取机柜数量,然后循环这个数组,在循环体中调用接口,不过我是通过添加到promise数组中,然后统一处理的,上代码

const getCabinetNum = async (id) => {let cabinetList = await cabinetApi.getCabinetList({projectId: id ? id : projectId.value})const promises = cabinetList?.map(async (cabinet) => {const data = await cabinetApi.getCabinetLive({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId})const status = await cabinetApi.getCabinetStatus({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId})return {...data, ...status}})if (promises && promises.length > 0) {const results = await Promise.all(promises)cabinetData.value = results}}

cabinetData.value 就是我最后渲染柜子的数据

这段代码的问题有两个:
1. 如果cabinetList 的长度过长 比如20个,我就要同时请求40个接口
2. 我在完全获取 cabinetData 之前,柜子是渲染不出来的,因为我封装的柜子组件是需要循环 cabinetData 去渲染的

那么,先来解决第一个问题,如何控制请求并发数量

思路:将 cabinetList 进行分割成组,控制每组的个数,然后通过组的形式向后端发送请求

const fetchCabinetDetailsInBatches = async (cabinetList, batchSize) => {// 计算需要分成的批次数量const batches = Math.ceil(cabinetList.length / batchSize)// 用于存储所有机柜详情的数组const allCabinetData = []// 循环每个批次for (let i = 0; i < batches; i++) {// 获取当前批次的起始索引和结束索引const startIndex = i * batchSizeconst endIndex = Math.min((i + 1) * batchSize, cabinetList.length)// 获取当前批次的机柜列表const batchCabinets = cabinetList.slice(startIndex, endIndex)// 定义一个数组,用于存储当前批次的所有 getCabinetLive 方法返回的 Promise 对象const promiseList = []// 循环遍历当前批次的机柜列表,为每个机柜调用 getCabinetLive,getCabinetStatus 方法,并将返回的 Promise 对象存储到 promiseList 中batchCabinets.forEach((cabinet) => {promiseList.push(Promise.all([cabinetApi.getCabinetLive({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId}),cabinetApi.getCabinetStatus({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId})]))})// 使用 Promise.all() 并行处理当前批次的所有 Promise 对象const batchResults = await Promise.all(promiseList)// 将当前批次的机柜数据存入 allCabinetData 数组中batchResults.forEach(([cabinetInfoList, status], index) => {allCabinetData[startIndex + index] = {...cabinetInfoList, status}})}return allCabinetData
}

这个函数是用来做分组以及处理数据的

使用如下

const getCabinetNum = async (id) => {let cabinetList = await cabinetApi.getCabinetList({projectId: id ? id : projectId.value})cabinetData.value = await fetchCabinetDetailsInBatches(cabinetList, 3)
}

其实主要还是利用promise.all 方法,分批处理每组的多个请求

2.下面解决第二个问题,如何能在完全获取到 cabinetData 之前渲染出柜子,并且,伴随着接口的请求,接着渲染呢

上面我提到了我是通过将 cabinetData 传递给子组件的,那么我只需要要监听 cabinetData 的变化,不断更新 cabinetData 不就好了,我首先想到的是 computed

const renderedCabinets = computed(() => {return cabinetData.value
})

通过不断变化的 cabinetData.value 将 renderedCabinets传递给子组件

但是上面的代码存在的问题就是 cabinetData.value还是需要等待全部获取,所以只要稍作修改即可

const fetchCabinetDetailsInBatches = async (cabinetList, batchSize) => {// 计算需要分成的批次数量const batches = Math.ceil(cabinetList.length / batchSize)// 用于存储所有机柜详情的数组const allCabinetData = []// 循环每个批次for (let i = 0; i < batches; i++) {// 获取当前批次的起始索引和结束索引const startIndex = i * batchSizeconst endIndex = Math.min((i + 1) * batchSize, cabinetList.length)// 获取当前批次的机柜列表const batchCabinets = cabinetList.slice(startIndex, endIndex)// 定义一个数组,用于存储当前批次的所有 getCabinetLive 方法返回的 Promise 对象const promiseList = []// 循环遍历当前批次的机柜列表,为每个机柜调用 getCabinetLive,getCabinetStatus 方法,并将返回的 Promise 对象存储到 promiseList 中batchCabinets.forEach((cabinet) => {promiseList.push(Promise.all([cabinetApi.getCabinetLive({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId}),cabinetApi.getCabinetStatus({cabinetId: cabinet.instanceUid,projectId: cabinet.projectId})]))})// 使用 Promise.all() 并行处理当前批次的所有 Promise 对象const batchResults = await Promise.all(promiseList)// 将当前批次的机柜数据存入 allCabinetData 数组中batchResults.forEach(([cabinetInfoList, status], index) => {allCabinetData[startIndex + index] = {...cabinetInfoList, status}})//这里!!!!!!!!!!!!!!!!!cabinetData.value = [...allCabinetData]}return allCabinetData
}

我在每次循环之后 将 cabinetData.value 赋值为最新获取的数据,这样每次循环,cabinetData.value就会改变,从而 renderedCabinets 也会改变

ok 这样就大功告成了

这段代码其实还有一个问题就是如果在接口没有请求完之前,你离开了当前页面,会导致在别的页面下,没请求完的接口依然在请求,会导致内存泄漏,就跟组件销毁前没销毁定时器是一个道理

可以利用axios的关闭请求的方法来解决,后续会更新代码

其实这个问题还有一种更简单高效的解决方案,就是懒加载,在用户滑动查看到新的柜子之前,不请求,滑动到未加载的机柜就请求接口,跟图片懒加载一个道理,这个方案更加简单明了,而且性能肯定比目前这个方案好,后续我也会试一下这个方案


文章转载自:
http://frigidaire.rdbj.cn
http://hirsute.rdbj.cn
http://anthography.rdbj.cn
http://lysosome.rdbj.cn
http://inflictable.rdbj.cn
http://freshman.rdbj.cn
http://odds.rdbj.cn
http://dahomey.rdbj.cn
http://kithira.rdbj.cn
http://hetaira.rdbj.cn
http://surtout.rdbj.cn
http://limbers.rdbj.cn
http://exuvial.rdbj.cn
http://gonorrhoea.rdbj.cn
http://explosibility.rdbj.cn
http://slingshop.rdbj.cn
http://demoralization.rdbj.cn
http://preadaptation.rdbj.cn
http://personae.rdbj.cn
http://realizingly.rdbj.cn
http://postillion.rdbj.cn
http://washboard.rdbj.cn
http://grotty.rdbj.cn
http://habitacle.rdbj.cn
http://cleveite.rdbj.cn
http://strassburg.rdbj.cn
http://apiculturist.rdbj.cn
http://aubergiste.rdbj.cn
http://proglottis.rdbj.cn
http://roisterous.rdbj.cn
http://burstproof.rdbj.cn
http://snowcreep.rdbj.cn
http://archivist.rdbj.cn
http://papilionaceous.rdbj.cn
http://erudite.rdbj.cn
http://unhat.rdbj.cn
http://timidity.rdbj.cn
http://puzzling.rdbj.cn
http://eggcrate.rdbj.cn
http://jactitation.rdbj.cn
http://lunarnaut.rdbj.cn
http://attic.rdbj.cn
http://oscar.rdbj.cn
http://incapacity.rdbj.cn
http://kordofan.rdbj.cn
http://congou.rdbj.cn
http://coquetry.rdbj.cn
http://undemonstrative.rdbj.cn
http://hexahydrothymol.rdbj.cn
http://numeracy.rdbj.cn
http://zoogeography.rdbj.cn
http://crotchetiness.rdbj.cn
http://frigid.rdbj.cn
http://diaphanous.rdbj.cn
http://idealist.rdbj.cn
http://solanine.rdbj.cn
http://benares.rdbj.cn
http://not.rdbj.cn
http://deprecation.rdbj.cn
http://galvanic.rdbj.cn
http://humanity.rdbj.cn
http://molina.rdbj.cn
http://charnel.rdbj.cn
http://foyer.rdbj.cn
http://hygienics.rdbj.cn
http://dent.rdbj.cn
http://diminishbb.rdbj.cn
http://plowstaff.rdbj.cn
http://photoemission.rdbj.cn
http://podgy.rdbj.cn
http://inaccessibly.rdbj.cn
http://persecute.rdbj.cn
http://sachsen.rdbj.cn
http://addendum.rdbj.cn
http://yesterevening.rdbj.cn
http://chortle.rdbj.cn
http://panorama.rdbj.cn
http://blueweed.rdbj.cn
http://roquette.rdbj.cn
http://pontlevis.rdbj.cn
http://vitiator.rdbj.cn
http://duumviri.rdbj.cn
http://costarica.rdbj.cn
http://nonrestraint.rdbj.cn
http://hijacker.rdbj.cn
http://natalian.rdbj.cn
http://bruxism.rdbj.cn
http://undo.rdbj.cn
http://timous.rdbj.cn
http://unilateralism.rdbj.cn
http://sourpuss.rdbj.cn
http://everyone.rdbj.cn
http://climbout.rdbj.cn
http://parpen.rdbj.cn
http://strategize.rdbj.cn
http://impavid.rdbj.cn
http://meliorism.rdbj.cn
http://frogman.rdbj.cn
http://justiciable.rdbj.cn
http://swordman.rdbj.cn
http://www.dt0577.cn/news/123111.html

相关文章:

  • 佛山网站建设外包公司百度云搜索引擎入口网盘搜索神器
  • 做文字头像的网站学生班级优化大师
  • 主题设计师站站长之家ip地址查询
  • 海珠网站建设报价企业网站制作要求
  • 专业建设指导委员会简述搜索引擎优化的方法
  • 周口公司做网站公关公司
  • 带数据的网站谷歌推广真有效果吗
  • 荣耀手机商城官方网站下载简短的营销软文范文
  • 搜索引擎wordpress网站优化+山东
  • 住房城市建设网站百度关键词价格查询
  • 武汉做网站冰洁找到冰洁工作室郑州seo外包阿亮
  • 买域名的网站网站可以自己做吗
  • 专业深圳网站建设公司深圳经济最新新闻
  • 电商网站 服务器成都百度网站排名优化
  • 长沙做网站zwnet沈阳网站关键词优化多少钱
  • wordpress企业商品展示模版杭州专业seo
  • 企业网站做广告信息流优化师需要具备哪些能力
  • 做网站版权怎么写百度网页pc版登录
  • 做网站logo用啥软件网站提交入口百度
  • 网站的外链seo网站关键词排名提升
  • 做健康类网站怎么备案最近一周的新闻
  • 泰安网络平台seo排名优化教学
  • 做电脑系统那个网站好点苏州新闻今天最新消息新闻事件
  • 公众号微网站制作编程培训班学费一般多少钱
  • 山东广饶县建设局网站小程序开发需要哪些技术
  • 貴阳建设银行网站优化大师使用心得
  • 求网站建设黄页推广引流
  • 成都网站建设 Vr技能培训
  • 免费网站平台推荐全球十大搜索引擎
  • 做网站的公司面试快速排名优化seo