使用ajax同步请求请求导致的页面假死
2024-02-10 16:52:16

 在一次开发移动端H5页面时发现ajax请求时没有显示请求等待的加载图形。因为这个ajax请求是在alert的确认按钮的回调函数中执行的,并且使用的是移动端框架的mui.alert()方式,所以首先把问题锁定在了mui这个框架上,通过chrome浏览器调试安卓页面发现,当在调用执行ajax请求时整个页面出现假死状态。

 在搜索了相关方面的资料后最后发现问题的原因:因为ajax使用了同步请求的关系,导致浏览器的UI渲染线程也同步等待着请求,因此在请求结束结束前整个浏览器都处于等待情况,出现的情况就是在ajax中的beforeSend函数中执行的loading图形无法正常加载。只要将同步改成异步就能正常执行,整个问题在firefox中不存在,在chrome浏览器中存在,因此也导致了在安卓手机上的H5页面出现这样的情况。

 在本次需求开发中这个ajax请求使用异步或者同步其实影响不大,但是如果需要调用函数中的ajax请求并且最后返回一个结果时如何解决这个问题呢?在以往的经验中如果需要返回一个结果必定要采用ajax的请求设置为同步,但是目前来看设置为同步后导致UI加载的停止,这样又影响页面的使用体验。查询相关资料后发现已经有很成熟的处理方式了。在Jquery1.5以后版本中提供了一个deferred的对象,这个对象能在异步请求的同时获取请求返回的结果。

 例子代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function test(){
var defer = $.Deferred();
var urlStr = "postcommit.html?I_SOURCE=getxliff";
$.ajax({
url : urlStr,
success: function(data){
defer.resolve(data);
}
});        
return defer.promise();
}

var result = $.when(test()).done(function(dataStr){
alert(dataStr);
});
上一页
2024-02-10 16:52:16