全局 loading

好久不见!

做项目中一直想用一个统一的 loading 状态控制全部的接口加载,但是一直不知道怎么处理,最近脑子突然灵光了一下想到了一个办法。

首先设置一个全局的 loading 状态,优先想到的就是 Pinia

然后因为页面会有很多接口会同时触发接口调用,但是接口响应时间是不一定的,所以采用计数法处理,代码如下

import { defineStore, acceptHMRUpdate } from "pinia";export const useLoadingStore = defineStore({id: "loading",state: () => ({count: 0}),getters: {/*** 控制 loading 状态* 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading* 取消请求 -1* 添加请求 +1* 请求报错 -1* 请求成功 -1* 请求失败 -1* 基本可以保证最后一定是 0* @returns {boolean}*/loading() {return this.count > 0;}},actions: {openLoading() {this.count + 1},closeLoading() {this.count - 1}}
});// 确保传递正确的 store 声明,本例中为 `useLoadingStore`
if (import.meta.hot) {import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
}

估计大佬也看出来了,虽然是个方法,但是很不严谨。因为简单的计数法,会有出现负数的情况,甚至两个接口同时响应的情况(当然这种很极端)

我询问了后端大佬,给我提供了一种互斥锁的概念可以融入其中,所以出现了现在的最好版本

先设计一个互斥锁

let lock = false;/*** 互斥锁 处理非常理超级极端的情况(忽略不计,顺便学习而已)* 开始锁* @returns {promise}*/
export const acquireLock = () => {return new Promise(resolve => {if (!lock) {lock = true;resolve();} else {setTimeout(resolve, 0);}});
};/*** 释放锁*/
export const releaseLock = () => {lock = false;
};

然后引入锁,并且计算的时候,引入 Math.max 方法

import { defineStore, acceptHMRUpdate } from "pinia";
import { acquireLock, releaseLock } from "@/utils/lock.js";export const useLoadingStore = defineStore({id: "loading",state: () => ({// loading: falsecount: 0}),getters: {/*** 控制 loading 状态* 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading* 取消请求 -1* 添加请求 +1* 请求报错 -1* 请求成功 -1* 请求失败 -1* 基本可以保证最后一定是 0* @returns {boolean}*/loading() {return this.count > 0;}},actions: {async openLoading() {// this.loading = true;await acquireLock();try {this.count = Math.max(1, this.count + 1); // 确保count不会变成负数} finally {releaseLock();}},async closeLoading() {// this.loading = false;await acquireLock();try {this.count = Math.max(0, this.count - 1); // 确保count不会变成负数} finally {releaseLock();}}}
});// 确保传递正确的 store 声明,本例中为 `useLoadingStore`
if (import.meta.hot) {import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
}

这样就可以

看下效果


count 为几就说明有几个接口还未响应

今天就这样,又是小白学习的一天,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3247109.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI软件小说推文直接生成漫画短视频,小说推广项目的辅助工具,前端uniapp。

有哪些AI的软件是比较热门的? 以下是一些常用的网页AI软件,可以用于绘图: Canva:Canva是一个非常受欢迎的网页平台,提供各种图形设计和绘图工具。它具有易于使用的界面和大量的模板和元素,可以帮助你创建出…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集,用于创建自定义的在线和离线安装…

【网络安全】PostMessage:分析JS实现XSS

未经许可,不得转载。 文章目录 前言示例正文 前言 PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口(例如,来自同一域名下的不同页面或者不同域名下的跨域页面)进行通信,而无需通过服务器…

【线程系列之五】线程池介绍C语言

一、基本概念 1.1 概念 线程池(Thread Pool)是一种基于池化技术管理线程的机制,旨在减少线程创建和销毁的开销,提高系统资源的利用率,以及更好地控制系统中同时运行的线程数量。线程池通过预先创建一定数量的线程&am…

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…

Python | Leetcode Python题解之第238题除自身以外数组的乘积

题目: 题解: class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:length len(nums)# L 和 R 分别表示左右两侧的乘积列表L, R, answer [0]*length, [0]*length, [0]*length# L[i] 为索引 i 左侧所有元素的乘积# 对于索引为…

一文掌握Prometheus实现页面登录认证并集成grafana

一、接入方式 以保护Web站点的访问控制,如HTTP 服务器配置中实现安全的加密通信和身份验证,保护 Web 应用程序和用户数据的安全性。 1.1 加密密码 通过httpd-tools工具包来进行Web站点加密 yum install -y httpd-tools方式一:通过htpasswd生…

人工智能 (AI) 应用:一个异常肺呼吸声辅助诊断系统

关键词:深度学习、肺癌、多标签、轻量级模型设计、异常肺音、音频分类 近年来,流感对人类的危害不断增加,COVID-19疾病的迅速传播加剧了这一问题,导致大多数患者因呼吸系统异常而死亡。在这次流行病爆发之前,呼吸系统…

【时时三省】(C语言基础)变量

山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 变量 可以改变的量 比如 int age=20 (类型 变量的名字=0) 如果后面要改可以直接代入 age=age1 age可以是任何字母 变量的分类…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏,有兴趣的 可以关注一下 公众号, 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class,该类继承自 cc.Graphics,用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

Qt实现简单的导航进度条——自定义控件

导航进度条通过其动态的视觉效果,‌不仅提供了任务进度的实时反馈,‌还增强了用户体验的流畅性和直观性。‌“进度”的设计方式多种多样,不同种类的运用需要根据具体场景来规划具体的进度方式,一般都要在清楚了解了每个方式的设计…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求:勇敢地对不合理的需求说不系统架构:做架构设计的时候,应充分考虑业务的实际情况,考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引:根据需求编写良…

JavaEE--JavaWeb服务器的安装配置(Tomcat服务器安装配置)

前言: 本文介绍了 Java Web 服务器 Tomcat 的安装配置,并详细说明了如何在 IntelliJ IDEA 中配置服务器,创建 JavaEE 项目,并发布文章。文章首先解释了前端程序如何访问后端程序以及 Web 服务器的概念,然后详细介绍了安装 Tomcat…

各地跨境电子商务示范区工具变量DID数据(2010-2022年)

数据来源:参考李震等(2023)的做法,从官方网站上搜集整理了我国跨境电子商务示范区名单与上市公司进行匹配制作。时间跨度:2010-2022年数据范围:上市企业包含指标: stock year 证券简称 In…

大模型RAG优化方案与实践(非常详细)从入门到精通,看这一篇就够了

RAG通过检索现有的大量知识,结合强大的生成模型,为复杂的问答、文本摘要和生成任务带来了全新的解决方案。本文详细的介绍了RAG遇到的挑战、通用范式、工程实践、优化实现策略等。 一、RAG的背景介绍 随着ChatGPT的兴起,大语言模型再次走进…

伪分布式部署 DolphinScheduler

1.添加用户 useradd dolphinscheduler echo "dolphinscheduler" | passwd --stdin dolphinscheduler sed -i $adolphinscheduler ALL(ALL) NOPASSWD: NOPASSWD: ALL /etc/sudoers sed -i s/Defaults requirett/#Defaults requirett/g /etc/sudoers chown -R …

7.17IO

1. #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 功能描述&#xff1a;打开name文件夹&#xff0c;返回该文件夹的描述符 返回值&#xff1a;成功返回描述符&#xff0c;失败返回NULL opendir()函数打开与目录名对应的目录流…

ssrf复习(及ctfshow351-360)

1. SSRF 概述 服务器会根据用户提交的URL发送一个HTTP请求。使用用户指定的URL&#xff0c;Web应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 如果没有对用户提交URL和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造"的缺陷…

C++之智能指针:shared_ptr、unique_ptr、weak_ptr的概念、用法即它们之间的关系

智能指针 (1)概述 A.Why&#xff08;C为什么引入智能指针&#xff09; C引入智能指针的根本原因就是解决手动管理动态内存所带来的问题&#xff0c;手动管理动态内存常见的问题如下&#xff1a;内存泄漏、悬挂指针、释放操作未定义等 内存泄漏问题&#xff1a; 当程序用光了它…

国产开源系统openEuler_24.03_LTS部署安装/基础配置/验证连接实操手册

前言&#xff1a; openEuler 是开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目。 欧拉操作系统(openEuler&#xff0c;简称“欧拉”,“开源欧拉”)是面向数字基础设施的操作系统&#xff0c;支持服务器、云计算、边缘计算、嵌入式等应用场…