Vue公共loading升级版(处理并发异步差时响应)
公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:
1.通过全局状态管理定义状态值(vuex、pinia等)。
2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。
3.在请求和相应拦截器中变更状态值。
第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求拦截中展示loading,在响应拦截器中判断收到成功响应时直接隐藏loading,这种方法看似可行但实际过程中却有问题。
例如,假设在第0秒时同时向后台发送了两个异步请求A和B,由于网络或处理逻辑不同,A请求0.5秒秒收到成功响应,B请求2秒才收到。那在第0.5秒,响应拦截器就会把loading状态变更,结束loading动画,但此时B请求还没收到返回。如果用户接下来的操作同时需要A和B请求的数据,提前结束动画会让用户体检变差。
解决思路:
定义一个全局对象来存储每个接口的响应状态,直到每个请求接口都收到响应才变更状态,结束loading动画。因为键名的唯一性,可以使用接口路径(或唯一接口编号)作为键名。请求时添加一个键值对,响应时变更键值,同时遍历对象状态值进行判断
let apiStatusList ={
'/api/a':true,//true请求中
'/api/b':false //false请求完成
}
具体操作如下(以vue3的pinia为例):
定义一个loading.js
import { defineStore } from 'pinia';
export const useLoadStore = defineStore('storeLoading', {
state: () => {
return {
apiStatusList:{},
loading:false, //网络加载状态,true加载中
};
},
actions: {
updateLoadingState(value){
this.loading = value
},
setApiStatusList(value){
this.apiList = value;
}
}
});
拦截器处理:
import axios from 'axios';
import { useLoadStore } from '../stores/loading';
const request = axios.create();
//请求拦截
request.interceptors.request.use(
(config) => {
//公共loading
const loadStore = useLoadStore();
let statusList = { ...loadStore.apiStatusList };
statusList[config.url] = true; //接口赋值为请求中
loadStore.setApiStatusList(statusList);
if (!loadStore.loading) { //判断loading是否正在展示中
loadStore.updateLoadingState(true);
}
return config;
},
(error) => {
return Promise.reject(error);
}
)
//响应拦截
request.interceptors.response.use(
(response) => {
const loadStore = useLoadStore();
let statusList = { ...loadStore.apiStatusList };
statusList[response.config.url] = false; ////接口赋值为请求完成
if (!Object.values(statusList).includes(true)) { //遍历对象,判断接口是否全部返回
if (loadStore.loading) {
loadStore.updateLoadingState(false);
loadStore.setApiStatusList({});
}
} else {
loadStore.setApiStatusList(statusList);
}
},
(error) => {//有接口报错,重置loading
const loadStore = useLoadStore();
if (loadStore.loading) {
loadStore.updateLoadingState(false);
loadStore.setApiStatusList({});
}
}
)
App.vue监听状态变化
//监听store状态值时需要传入function
watch(()=>loadStore.loading,(newValue, oldValue)=>{
if(newValue){
showLoadingToast({
duration: 0,
forbidClick: true,
});
}else{
closeToast();
}
})
Vue公共loading升级版(处理并发异步差时响应)的更多相关文章
- 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...
- 以寡治众各个击破,超大文件分片上传之构建基于Vue.js3.0+Ant-desgin+Tornado6纯异步IO高效写入服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_218 分治算法是一种很古老但很务实的方法.本意即使将一个较大的整体打碎分成小的局部,这样每个小的局部都不足以对抗大的整体.战国时期 ...
- Vue(基础七)_webpack(webpack异步加载原理)
---恢复内容开始--- 一.前言 1.webpack异步加载原理’ 2.webpack.ensure原理 ...
- 高并发异步解耦利器:RocketMQ究竟强在哪里?
上篇文章消息队列那么多,为什么建议深入了解下RabbitMQ?我们讲到了消息队列的发展史: 并且详细介绍了RabbitMQ,其功能也是挺强大的,那么,为啥又要搞一个RocketMQ出来呢?是重复造轮子 ...
- 解决docker中使用nginx做负载均衡时并发过高时的一些问题
# 解决docker中使用nginx做负载均衡时并发过高时的一些问题 1.问题产生原因: 由于通过nginx作为负载均衡服务,在访问并发数量达到一定量级时jmeter报错. nginx日志关键信息:a ...
- Vue.js 使用 Swiper.js 在 iOS 11 时出现错误
前言 在H5项目中,需要用到翻页效果,通过 Swiper 来实现,安装 Swiper npm i swiper -S 但是实际使用中,发现低版本 iOS < 11 会出现下面这个错误: Synt ...
- vue深入了解组件——动态组件&异步组件
一.在动态组件上使用 keep-alive 我们之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件: <component v-bind:is="currentTabComp ...
- 并发异步编程之争:协程(asyncio)到底需不需要加锁?(线程/协程安全/挂起/主动切换)Python3
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_208 协程与线程向来焦孟不离,但事实上是,线程更被我们所熟知,在Python编程领域,单核同时间内只能有一个线程运行,这并不是什么 ...
- vue+echarts 动态绘制图表以及异步加载数据
前言 背景:vue写的后台管理,需要将表格数据绘制成图表(折线图,柱状图),图表数据都是通过接口请求回来的. 安装 cnpm install echarts --s (我这里用了淘宝镜像,不知道同学自 ...
- vue公共
1 需求:在做项目的过程中发现,有一些功能是公共的,于是就想把这些公共的功能抽出来,做成独立的模块,别的项目需要用到,直接引用这个模块 2 问题: 前端:1 是用vue做的,vue的跳转是通过rout ...
随机推荐
- 获取Rtx用户状态方法
背景:企业OA系统需要与Rtx集成,且高权限身份用户需要获取符合某一条下的所有员工rtx状态... 方案:以此背景,基于rtx sdk做二次开发, 1.后台调用RootObj.QueryUserSta ...
- Blazor前后端框架Known-V1.2.9
V1.2.9 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...
- 预处理器 Less 的十个语法
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 不过浏览器只能识别 CSS 语言,所以 Les ...
- RedHat8静默安装was
前言 was(websphere application server),类似weblogic.tomcat,由IBM开发的一种企业级Java容器. 系统版本:redhat 8.2 was版本:was ...
- Go/C++/Java中的数组对比
数组是大多数编程语言中的基本数据结构.然而,不同的编程语言对数组的实现和语义有所不同.以下是 Go.C++ 和 Java 中数组的主要区别: 1. 基本性质 Go: 数组是值类型.赋值或将数组传递给函 ...
- Java安全之Webshell免杀
Java安全之Webshell免杀 当遇到文件上传时,如果网站存在查杀软件,我们上传的一句话木马会被直接秒杀,这时候就需要做一下免杀,绕过查杀软件的检测. 思路 我的想法是先拆分,然后分别检验那些语句 ...
- Django+anaconda(spyder)
一.搭建django虚拟环境 打开anaconda prompt 输入:conda create -n mydjango_env 判断(y/n):y 查看虚拟环境 conda env list *号表 ...
- Gitbook Android App
最有用Ionic 2 做了一个Gitbook 混合app, 上线google play的时候提醒我触犯了假冒行为,可能是logo和名字问题吧,放弃: 上线腾讯被认为是h5 app,不是native a ...
- JUC并发编程(4)—ThreadLocal介绍(超详细 集大成版本!!!)
目录 ThreadLocal简介 ThreadLocal与Synchronized的区别 ThreadLocal API ThreadLocal的使用案例 阿里ThreadLocal规范 Thread ...
- 前端三件套系例之JQuery——JQuery动画效果、JQuery插件、
文章目录 1 JQuery动画效果 1. 基本效果 2. 滑动效果 3 淡入淡出效果 4 自定义动画 5 动画控制 6 设置 7 事件 7-1 常用事件 7-2 事件绑定 7-3 移除事件 7-4 阻 ...