Ajax同步请求浏览器假死问题
Posted 举个栗子Stone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax同步请求浏览器假死问题相关的知识,希望对你有一定的参考价值。
01
问题说明
Ajax请求作为浏览器异步请求后台资源的方法,我相信大家在开发过程中都会用到,而且使用频率也会非常高,ajax不仅仅可以异步调用,也可以同步请求(async:false),但是当我们请求后端资源消耗很多时间,前端不能及时得到响应的时候就会造成浏览器假死的现象,这主要是因为同步Ajax引起了UI线程阻塞,当该请求得到响应之后才会解除阻塞。
下面是正常的ajax异步请求
$.fn.loading();
$.ajax( {
type : "POST",
url : "microblog/getData.do",
timeout : 3600000,
success : function(data, textStatus) {
$.fn.endLoading();
},
error : function(result) {
alert("Ajax请求失败,请及时联系管理员!");
}
});
注释:$.fn.loading();和$.fn.endLoading();是自定义的遮罩加载菊花开始和结束方法。
请看菊花:
如果该ajax请求为异步请求,加载菊花正常显示,如果该ajax请求加上async:false;属性,浏览器就开始出现假死现象。
02
优化方案
$.Deferred()函数;
function uplaodImage(){
$.fn.loading();
$.when(postAjax()).done(function(data){
$.fn.endLoading();
}).fail(function(data){console.log(data); alert("出错啦!"); });;
}
function postAjax(){
var defer = $.Deferred();
$.ajax( {
type : "POST",
url : "microblog/getData.do",
timeout : 3600000,
success : function(data, textStatus) {
defer.resolve(data);
},
error : function(result) {
alert("Ajax请求失败,请及时联系管理员!");
}
return defer
});
}
使用上面方法成功解决了ajax同步上传浏览器假死问题。
$.Deferred()是jQuery自带函数,高手都会用,你还不赶紧百度一下。
以上是关于Ajax同步请求浏览器假死问题的主要内容,如果未能解决你的问题,请参考以下文章