单线程的JS中Vue导致的“线程安全”问题
目录
- 现象
- 分析
- 原因
浏览器中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,具体之后再学习学习
相关文章:
单线程的JS中Vue导致的“线程安全”问题
目录 现象分析原因 浏览器中Js是单线程的,当然不可能出现线程安全问题。只是遇到的问题的现象与多线程的情况十分相似,导致对不了解Vue实现的我怀疑起了人生… 现象 项目中用到了element-plus中的加载组件,简单封装了一下,用来保…...
vue2 - SuperMap3D加载基于Nginx服务生成的3DTileset模型切片服务地址
文章目录 🍍开发环境🍉1:nginx发布3Dtileset模型切片服务🍍1.1:准备3DTileset文件🍍1.2:安装nginx服务,配置相关文件1.2.1:下载nginx1.2.2:下载完解压文件如下1.2.3:将3Dtileset模型文件放置 nginx-1.24.0/html/gc 新建文件中如下:1.2.4:配置nginx服务🍉2:…...
新版本Spring Security 2.7 + 用法,直接旧正版粘贴
一、以前的用法: Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}Overrideprotected void configure(HttpSecurity http) throws Exceptio…...
JVM——类加载器(JDK8及之前,双亲委派机制)
目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器(ClassLo…...
(七)什么是Vite——vite优劣势、命令
vite分享ppt,感兴趣的可以下载: Vite分享、原理介绍ppt 什么是vite系列目录: (一)什么是Vite——vite介绍与使用-CSDN博客 (二)什么是Vite——Vite 和 Webpack 区别࿰…...
vue之Error: Unknown option: .devServer.
背景 在使用内网穿透工具时,加入对应的配置,启动出现报错。 一、遇到的问题 报错: Error: Unknown option: .devServer. Check out https://babeljs.io/docs/en/babel-core/#options for more information about options. Error: Unknown …...
基于ssm的房屋租售网站(有报告)。Javaee项目,ssm项目。
演示视频: 基于ssm的房屋租售网站(有报告)。Javaee项目,ssm项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍: 采用M(mode…...
LeeCode AutoX-4 计算几何
题意 传送门 LeeCode AutoX-4 蚂蚁爬行 题解 枚举每一对几何图形,判断相交性,用并查集维护连通性即可。总时间复杂度 O ( n 2 m ) O(n^2 m) O(n2m),其中 n n n 为几何图形数量, m m m 为查询数量。 根据几何图形性质分类讨…...
Vue3 动态设置 ref
介绍 在一些场景,ref设置是未知的需要根据动态数据来决定,如表格中的input框需要我们主动聚焦,就需要给每一个input设置一个ref,进而进行聚焦操作。 Demo 点击下面截图中的编辑按钮,自动聚焦到相应的输入框中。 &…...
fast lio 2 保存每一帧的点云PCD和里程计矩阵 Odom 在txt文件
修改了源代码的 laserMapping.cpp 文件,替换为下面的代码就可以保存了,注意里面有一个路径,需要修改为你的电脑的路径 // This is an advanced implementation of the algorithm described in the // following paper: // J. Zhang and S. Singh. LOAM: Lidar Odometry an…...
当前主流DDos方式有哪几类
随着互联网的普及和技术的进步,网络安全问题日益凸显。DDoS攻击作为其中一种常见且具破坏性的攻击方式,受到了广泛关注。小德将带领大家一起来了解当前流行的三种DDoS攻击方式。 1. 容量耗尽攻击 容量耗尽攻击是最常见也是最直接的DDoS攻击方式。攻击者通…...
神经网络常见评价指标AUROC(AUC-ROC)、AUPR(AUC-PR)
神经网络的性能可以通过多个评价指标进行衡量,具体选择哪些指标取决于任务的性质。以下是神经网络中常见的评价指标: 准确性(Accuracy): 准确性是最常见的分类任务评价指标,表示模型正确预测的样本数占总样…...
Apache Doris安装部署
Apache Doris安装部署 版本: CentOS 7.6 Apache Doris 0.14.0 编译 选择合适的版本进行下载,此次选择0.14.0版本 下载 | Apache Doris 一、CentOS编译 1 安装依赖 sudo yum groupinstall Development Tools && sudo yum install maven c…...
Excel查询时用vlookup或者xlookup时,虽然用的参数选择的是精确匹配,但是发现不能区分大小写,应该如何解决?
Excel查询时用vlookup或者xlookup时,虽然用的参数选择的是精确匹配,但是发现不能区分大小写,应该如何解决? Index函数解决 INDEX([excel1.xlsx]Sheet1!$E:$E,MATCH(1,EXACT(G5,[excel1.xlsx]Sheet1!$E:$E)*1,0))重点说明&#x…...
4种经典的限流算法
0、基础知识 1000毫秒内,允许2个请求,其他请求全部拒绝。 不拒绝就可能往db打请求,把db干爆~ interval 1000 rate 2; 一、固定窗口限流 固定窗口限流算法(Fixed Window Rate Limiting Algorithm)是…...
<MySQL> 什么是数据库事务?事务该如何使用?
目录 一、事务的概念 二、事务的核心特性 三、事务操作中的常见BUG 3.1 脏读 3.2 不可重复读 3.3 幻读 四、隔离级别 五、使用事务 一、事务的概念 “事务”是指一组操作,在逻辑上是不可分割的,组成这组操作的各个语句,或者全部执行成…...
Linux 网络:PMTUD 简介
文章目录 1. 前言2. Path MTU Discovery(PMTUD) 协议2.1 PMTUD 发现最小 MTU 的过程 3. Linux 的 PMTUD 简析3.1 创建 socket 时初始化 PMTUD 模式3.2 数据发送时 PMTUD 相关处理3.2.1 源头主机发送过程中 PMTU 处理3.2.2 转发过程中 PMTUD 处理 4. PMTUD 观察5. 参考链接 1. 前…...
BatchNormalization:解决神经网络中的内部协变量偏移问题
ICML2015 截至目前51172引 论文链接 代码连接(planing) 文章提出的问题 减少神经网络隐藏层中的”内部协变量偏移”问题。 在机器学习领域存在“协变量偏移”问题,问题的前提是我们划分数据集的时候,训练集和测试集往往假设是独立同分布(i.i.d)的,这种独立同分布更有利于…...
DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)
DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波,DAC 初始化部分还是用 DAC 输出实验 的,所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波,通过 KEY0/KEY1 两个按键,控制 DAC1 的通道 1 输出两种…...
许多网友可能还不知道,升级到Windows 11其实没那么复杂,只要符合几个条件可以了
如果你的Windows 10电脑可以升级Windows 11,现在怎么办?有几种方法可以免费安装新的操作系统。以下是你的选择。 如果你想升级到Windows 11,你可以随时购买一台已经安装了操作系统的新电脑。然而,如果你目前的Windows 10 PC满足所有必要的升级要求,那么在Windows 11免费的…...
PP实施经验分享(22)——(ECC版本)生产版本\BOM\工艺路线选择策略与批量大小优化实践
1. ECC版本下生产版本的选择逻辑 在SAP ECC系统中,生产版本的选择逻辑与S4版本存在显著差异。我经历过一个汽车零部件制造项目,当时客户就遇到了生产版本选择混乱的问题。他们原先使用的是S4系统,切换到ECC后发现很多配置需要重新调整。 物料…...
Plumbum部署指南:生产环境配置、安全与监控完整方案
Plumbum部署指南:生产环境配置、安全与监控完整方案 【免费下载链接】plumbum Plumbum: Shell Combinators 项目地址: https://gitcode.com/gh_mirrors/pl/plumbum Plumbum作为Python Shell Combinators库,为生产环境提供了强大的命令行执行和远程…...
【微信小程序更新机制全解析】原理、实践与最佳实践
前言 微信小程序的更新机制,是连接开发者版本迭代与用户体验的核心桥梁。它设计的核心逻辑是**“自动无感更新为主,手动强制更新为辅”,在保证小程序快速启动、稳定可用**的前提下,尽可能让用户使用最新版本;同时为开…...
5分钟完成Axure RP中文汉化:小白也能轻松上手的终极教程
5分钟完成Axure RP中文汉化:小白也能轻松上手的终极教程 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure…...
发动机阀系系统设计避坑指南:AVL-Excite中这10个元素配置最容易出错
发动机阀系系统设计避坑指南:AVL-Excite中这10个元素配置最容易出错 在发动机阀系系统的仿真建模中,AVL-Excite作为行业标杆工具,其强大的功能背后也隐藏着诸多配置陷阱。许多工程师在完成基础建模后,往往会在看似简单的参数设置上…...
XGantt:Vue3项目管理的终极可视化解决方案
XGantt:Vue3项目管理的终极可视化解决方案 【免费下载链接】gantt A powerful and flexible Gantt chart component library for developers, written in native JS Canvas. Supports TypeScript. 中文文档 项目地址: https://gitcode.com/gh_mirrors/gantt/gant…...
炉石传说自动化工具:从效率提升到智能策略的全栈解决方案
炉石传说自动化工具:从效率提升到智能策略的全栈解决方案 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 在快节奏的现代生活中,…...
德希科技在线污泥浓度传感器
一、应用场景与产品定位 污泥浓度是污水处理生化系统稳定运行的关键控制指标,研发人员针对市政污水、工业废水处理厂曝气池、二沉池、氧化沟等场景的监测需求,推出散射光法在线污泥浓度传感器。设备以高稳定性、强抗干扰、长寿命的特性,适配…...
TranslucentTB 架构深度解析:Windows 任务栏透明化技术实现与工程化实践
TranslucentTB 架构深度解析:Windows 任务栏透明化技术实现与工程化实践 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB Tran…...
Wan2.2-I2V-A14B企业应用:合规可控的AI视频生成私有云部署方案
Wan2.2-I2V-A14B企业应用:合规可控的AI视频生成私有云部署方案 1. 企业级视频生成解决方案概述 在当今内容创作需求爆炸式增长的环境下,企业面临着视频制作成本高、周期长的挑战。Wan2.2-I2V-A14B私有部署镜像提供了一套完整的解决方案,让企…...
