使用Deffer解决页面假死与异步加载问题
需积分: 17 187 浏览量
更新于2024-09-10
收藏 728B TXT 举报
"同步显示遮罩deffer"
在Web开发中,我们经常遇到用户界面(UI)在处理大量数据或执行耗时操作时出现“假死”现象。这是因为浏览器的JavaScript执行线程与页面渲染线程之间存在冲突。为了解决这个问题,我们可以使用`defer`策略,特别是配合Promise对象来优化异步操作,如在循环中执行多个Ajax请求。这种技术有助于避免阻塞用户界面,同时确保所有操作完成后才进行下一步,例如隐藏加载遮罩。
标题中提到的“同步显示遮罩deffer”是指在执行异步操作(如Ajax请求)时,先显示遮罩层(通常是一个加载图标),然后在所有异步操作完成后再关闭遮罩层。这可以提供更好的用户体验,让用户知道后台正在处理任务。
在描述中,提到的解决方案是利用JavaScript中的Promise和`$.Deferred()`对象。`$.Deferred()`是jQuery提供的一个用于创建Promise对象的工具,它可以让我们更灵活地处理异步操作。当我们在循环中执行多个Ajax请求时,可以在循环外部创建一个空数组,然后每次Ajax请求成功后,将数据推入该数组。当数组长度等于循环次数时,使用`defer.resolve()`方法来解决Promise,从而触发后续的操作,例如隐藏遮罩。
以下是一个示例代码:
```javascript
function getData3() {
var defer = $.Deferred();
$.ajax({
url: 'p.php',
// async: false, // 不推荐使用同步请求,会导致页面阻塞
success: function(data) {
defer.resolve(data);
}
});
return defer.promise();
}
$('.btn3').click(function() {
$('.loadingicon').show(); // 显示加载遮罩
$.when(getData3()).done(function(data) {
$('.loadingicon').hide(); // 隐藏加载遮罩
alert(data);
});
});
```
在这个例子中,`$.when(getData3())`创建了一个Promise,当`getData3()`返回的Promise被解决(即Ajax请求成功)时,`.done()`回调函数会被调用。这意味着在所有Ajax请求完成并且遮罩被显示之后,才会隐藏遮罩并显示数据。
值得注意的是,虽然在循环中使用`defer`和Promise可以解决页面假死问题,但也要注意避免滥用。如果Ajax请求过多,可能会导致内存占用增加。因此,合理地组织和优化异步操作至关重要。此外,现代JavaScript引入了`async/await`语法,可以进一步简化异步编程,使得代码更加清晰易读。不过,这个案例中仍然使用了基于Promise的传统jQuery方法。
2019-07-04 上传
2023-06-09 上传
2023-06-03 上传
2023-06-08 上传
2023-06-11 上传
2023-05-31 上传
2023-09-21 上传
2023-06-28 上传
pbq1127849901
- 粉丝: 0
- 资源: 1
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全