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

响应式网站建设哪里有如何实施网站推广

响应式网站建设哪里有,如何实施网站推广,企业网站建设测试题,二手车做网站的目的目录 现象分析原因 浏览器中Js是单线程的,当然不可能出现线程安全问题。只是遇到的问题的现象与多线程的情况十分相似,导致对不了解Vue实现的我怀疑起了人生… 现象 项目中用到了element-plus中的加载组件,简单封装了一下,用来保…

目录

  • 现象
  • 分析
  • 原因

浏览器中Js是单线程的,当然不可能出现线程安全问题。只是遇到的问题的现象与多线程的情况十分相似,导致对不了解Vue实现的我怀疑起了人生…

现象

项目中用到了element-plus中的加载组件,简单封装了一下,用来保证只会出现一个加载框,大概是这样

import { ElLoading } from 'element-plus'let instance
let count = 0
export function startLoading() {if (count === 0) {// 临界区instance = ElLoading.service()}count++
}
export function stopLoading() {count--if (count === 0) {instance.close()}
}

使用的时候,意外的出现了多个实例,但是只保存了最后创建的实例,导致界面上有个loading无法关闭。
复现Demo

分析

打断点调试发现,到instance = ElLoading.service()之后没有继续往下count++而是再次去到if (count === 0),由于还没有++所以count还是0,进入if,重复创建了loading实例。
这个现象,乍一看,和有两条线程同时进入了startLoading的情况一模一样。不过我发现后面count++的值是没错的,所以把count++提到前面,改成这样,问题没有再复现。

export function startLoading() {count++if (count === 1) {instance = ElLoading.service()}
}

如果存在线程安全,那么count++如果不是原子操作的话,同样的问题还是会出现的。查了一圈资料,没有找到相关信息。
最终是在打断点的时候看了一眼调用堆栈,发现第二次的startLoading是在第一次的Loading组件mount的时候调用的。也就是说两次调用是串行的嵌套关系,而不是并行,直接松了一口气😅
调用堆栈截图

原因

问题的关键在于Vue的watch实现,第二次的startLoading是在watch中调用的。watch的数据变化事件会被Vue放到队列中,在mount组件时会先处理这个队列,所以在mount第一个Loading组件时,执行了第二个startLoading
关键方法是flushPreFlushCbs,具体之后再学习学习

http://www.hotlads.com/news/4794.html

相关文章:

  • 青岛 网站维护桌子seo关键词
  • 着陆页制作网站如何写软文推广产品
  • 宝应县住房和城乡建设局网站太原网站建设方案咨询
  • 海淀网站制作全国各城市感染高峰进度查询
  • 评论凡科网站建设怎么样在线生成个人网站源码
  • 网站如何被收录情况哪里可以做
  • 助听器网站建设方案草稿今日热点新闻一览
  • 企业型网站建设搜索引擎优化指的是什么
  • 望城建设局网站win10优化大师免费版
  • 个人备案用作资讯网站快速网络推广
  • 网站内部链接导向seo网站内部优化方案
  • 自定义字段wordpressseo整站排名
  • 网站设计课程总结最新营销模式
  • 个人网站建设的要点软文推广页面
  • 网站在什么地方设关键词手机制作网页用什么软件
  • 专业做英文网站的公司seo资源咨询
  • 银行的网站怎么做软文平台
  • 山西中宇建设集团网站想要网站导航推广
  • 一台vps两个wordpress网站什么叫seo优化
  • 怎么做百度自己的网站亚马逊跨境电商开店流程及费用
  • 没有网站可以做seo吗江西seo推广
  • 网站开发建设一般多少钱seo入门培训教程
  • 哪个网站空间好郑州网站建设公司排名
  • 东莞品牌网站建设报价软文写作的三个要素
  • 嵊州建设银行取款网站网站查询网
  • 大型网站开发什么书籍好河南省疫情最新情况
  • 北京工程建设信息网站全球最大的中文搜索引擎
  • 广州网站seo渠道营销推广方案
  • 做特卖的网站怎么赚钱十大网站平台
  • 做网站哪里找找资源的关键词有哪些