函数内的ajax同步请求导致遮罩层失效、或者导致loading正在加载提示失效问题

2023-11-16

功能需求

编写点击按钮,弹出loading遮罩层提示正在加载中…,同时查询后台信息,拼接数据后渲染到列表时,为了保障渲染时,列表中的数据已经拼接完成。所以在for循环中使用同步ajax进行请求,在success方法中进行拼接。

function showPrintJobList(){
	var loadingTip = $('#loading');
	loadingTip.show();
	for(var i = 0;i < rwid.length;i++){
		$.ajax({
			url: xxxxx,
			async: false,  //默认异步,为保证数据完整和顺序使用同步请求
			type: 'POST',
			data:{
				xxx: xxx
			},
			dataType: 'json',
	      	success: function(result) {
				//.....循环拼接结果,弹窗显示列表:$('#rwlist').show();
			},
			error: function(err){
				console.log(err);
			}
		});
	}
	loadingTip.hide();
	$('#rwlist').show();
}

问题信息

点击按钮后,遮罩层没有弹出,而是等待表单渲染完成后,看到一闪而过的遮罩层。

问题原因async: false

ajax同步请求在运行的时候,浏览器的UI、Dom元素渲染会被阻塞。所以当点击事件触发showPrintJobList函数时,loading.show()是有被加载到浏览器的js运行线程中,但是运行到ajax同步请求时,会将loading.show()阻塞执行,等到同步ajax请求完了,才会运行。然后同步ajax已经请求完了,然后直接被隐藏,然后显示列表。所以会看到一闪而过的loading遮罩层

解决方法

一、使用async wait关键字
二、使用JQuery的Deferred对象和$.when().done().fail()

async/await关键字
  1. 标识所修饰的函数存在异步代码,函数内部可用await关键字修饰异步过程变为同步。函数内部也可以全部为同步代码。
  2. 非阻塞:async所标识的函数内存在异步代码,会等待异步代码执行完,但是async函数本身会马上返回,不会阻塞当前js工作主线程,可以简单认为,async函数工作在主线程,同步执行,不会阻塞界面渲染,async函数内部由await关键字修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回;

代码修改如下:

async function showPrintJobList(){
	var loadingTip = $('#loading');
	loadingTip.show();
	for(var i = 0;i < rwid.length;i++){
		await $.ajax({   //使用await关键字修饰异步请求,保证数据顺序完整
			url: xxxxx,
			async: true,  //有await关键字,ajax请求修改为异步
			type: 'POST',
			data:{
				xxx: xxx
			},
			dataType: 'json',
	      	success: function(result) {
				//.....循环拼接结果,弹窗显示列表:$('#rwlist').show();
			},
			error: function(err){
				console.log(err);
			}
		});
	}
	loadingTip.hide();
	$('#rwlist').show();
}

或者使用JQuery的Deferred对象和$.when().done().fail()使异步请求同步执行,同时不阻塞主线程。

var dataList = [];
function showPrintJobList(){
	var defer = $.Deferred();
	for(var i = 0;i < rwid.length;i++){
		$.ajax({   
			url: xxxxx,
			async: true,  //使用Deferred对象,ajax请求修改为异步
			type: 'POST',
			data:{
				xxx: xxx
			},
			dataType: 'json',
	      	success: function(result) {
				//dataList保存结果
				dataList.push(result);
				defer.resolve(dataList);
			},
			error: function(err){
				defer.reject(err);
			}
		});
	}
	return defer;
}

$('button#showList').click(function(){
	var loadingTip = $('#loading');
	loadingTip.show();
	$.when(showPrintJobList()).done(function(data){
        //循环拼接data中的list中的数据
        loadingTip.hide();
		$('#rwlist').show();
    }).fail(function(){
    	console.log(err);
    });
}

原理解析

浏览器中一般会运行UI线程、JS线程以及事件触发线程。
在上述上述代码中,loading.show()方法涉及到dom树的更新,所以被加载到了UI线程执行任务中。但是后面的ajax同步请求,因为不是异步的所以浏览器不会重新新增一个线程进行请求,而是直接放在js线程中阻塞其他线程执行。所以UI线程不能执行loading.show()方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数内的ajax同步请求导致遮罩层失效、或者导致loading正在加载提示失效问题 的相关文章

随机推荐

  • PHP-Guzzle异步、并发

    参考 Guzzle文档 PHP Guzzle是一个HTTP客户端 可以使用它来发送各种HTTP请求 并发请求一 promises key1 gt client gt getAsync website1 key2 gt client gt g
  • el-table + setup语法糖 + 列表变化后滚动条置顶

    el table setup语法糖 列表变化后滚动条置顶 由于需要做一个el table 然后再更新地图同时将滚动条滚至最上 但是网上很多资料都是使用this refs 底部 this nextTick gt this refs table
  • SSM框架---springMVC

    目录 一 概述 分层思想 二 工作原理 1 导入jar包 2 创建启动类 三 处理请求参数 3 1 get方式 3 2 post方式 3 3 restful方式 推荐 四 处理get 请求的参数 五 处理post请求的参数 六 处理rest
  • ACM学习计划

    看完人家的博客 发现任重道远 一位高手对我的建议 一般要做到50行以内的程序不用调试 100行以内的二分钟内调试成功 acm主要是考算法的 主要时间是花在思考算法上 不是花在写程序与debug上 下面给个计划你练练 第一阶段 练经典常用算法
  • PHP的bcadd()函数用法

    求和后保留X位小数的函数 一般用于价格累加 查询出来的价格即使是浮点型 但是运用 后会变成整型 若需求需要保留小数位 则需要用到这个函数 bcadd 被加数 加数 保留几位小数 bcadd 1 3 2 4 00
  • 华为OD机试真题-最长密码【2023.Q1】

    题目描述 小王在进行游戏大闯关 有一个关卡需要输入一个密码才能通过 密码获得的条件如下 在一个密码本中 每一页都有一个由26个小写字母组成的若干位密码 每一页的密码不同 需要从这个密码本中寻找这样一个最长的密码 从它的末尾开始依次去掉一位得
  • 从零开始学前端(一)

    1 在桌面空白的地方 点击右键新建一个文本文档 2 双击或者右键打开刚刚新建的文件 3 将下面的代码复制到刚刚打开的txt文件中 h1 大家好 我是一只羊 这是我的第一个网页 h1 p Hello world p 4 点击文件 点击另存为
  • Mysql模糊查询like效率,以及更高效的写法

    原文来自 https www cnblogs com chaobest p 6737901 html 在使用msyql进行模糊查询的时候 很自然的会用到like语句 通常情况下 在数据量小的时候 不容易看出查询的效率 但在数据量达到百万级
  • Linux的学习步骤

    linux 基本操作命令 linux 各种配置 环境变量配置 网络配置 服务配置 linux 环境下搭建各种开发环境 Linux 写基本的shell脚本 对linux进行维护 Linux 安全设置 防止攻击 保障服务器的正常运行 能对系统尽
  • 飞腾CPU虚拟化相关代码分析(三)

    飞腾CPU虚拟化相关代码分析 三 函数set cpu boot mode flag 基本描述 根据CPU启动模式 来设置 boot cpu mode全局数组变量 函数输入输出描述 输入 寄存器w0 函数el2 setup的输出 寄存器w0
  • 树形dp(例题)

    树的最长路径带权值 树的直径可能时红色的边 从上图可以看出 每次要两个变量存放以u为根 最长路径d1 和次长路径d2 那么整个树的最长路径就有可能是d1 d2 我们每次要返回以u为根的贯穿试的最长路径 给他的父节点判断使用如下图 inclu
  • 如何求矩阵的逆矩阵

    如何求矩阵的逆矩阵 叮叮当当sunny 博客园 求逆矩阵最有效的方法是初等变换法 虽然还有别的方法 如果要求方阵 AA 的逆矩阵 标准的做法是 将矩阵 AA 与单位矩阵 II 排成一个新的矩阵 AI AI 将此新矩阵 AI AI 做初等行变
  • 埋点是什么?有什么作用?前端如何埋点?

    一 什么是埋点 埋点 tracking 是指在应用程序中插入代码或工具来记录某些事件的行为和属性 例如用户在应用中的点击 浏览 购买 注册等操作行为 这些数据可以被用来分析用户行为 优化产品功能 改进用户体验等 通过埋点 开发人员可以采集用
  • /Library/Developer/CommandLineTools/usr/bin/python3 :NO module named pytest解决

    报错场景 已经用pip3 install pytest 成功下载pytest 结果运行python3 m pytest xxx py还是报错 Library Developer CommandLineTools usr bin python
  • *python解决狼羊菜过河问题

    python解决狼羊菜过河问题 A岸有菜 羊 狼 农夫农夫必须将他们都送到B岸每次只能送一个 在保证他们不会被吃的前提下 完成任务 并得出步骤 代码 A 狼 1 羊 1 菜 1 B 狼 0 羊 0 菜 0 size len A count
  • 没有与这些操作数匹配的`“>>“`运算符错误;

    报错信息 没有与这些操作数匹配的 gt gt 运算符错误 网上查询大多是少了头文件
  • python反混淆javascript代码

    JavaScript代码一般都是可见的 一些关键的加密算法写在JS里其实很不安全 代码混淆能将Js进行压缩 使之变成不易读的代码 如下图所示 当然这难不倒我们 网上有很多js反混淆的工具 作者推荐使用jsbeautifier 因为最近项目用
  • CSDN上传付费资源需要创作者等级Lv4,我的升级之路,本文持续更新,欢迎各位分享自己的升级经验

    首先来看看官方的要求 创作者等级Lv4 实名认证 原力等级 5 目前惟一满足的实名认证 创作者等级升级官方说明 计分标准 计分规则 分值 说明 资源量 每上传1个资源 审核通过 5分 若自行或被平台删除及下架则扣除对应分数 分数实时更新 阅
  • 【React】react-router-dom

    文章目录 1 路由器组件 lt HashRouter gt lt BrowserRouter gt 2 路由 2 1 lt Route gt 2 1 1 lt Route element gt 2 1 2 lt Route path gt
  • 函数内的ajax同步请求导致遮罩层失效、或者导致loading正在加载提示失效问题

    功能需求 编写点击按钮 弹出loading遮罩层提示正在加载中 同时查询后台信息 拼接数据后渲染到列表时 为了保障渲染时 列表中的数据已经拼接完成 所以在for循环中使用同步ajax进行请求 在success方法中进行拼接 function