jQuery Ajax同步参数导致浏览器假死怎么办
https://www.cnblogs.com/panmy/p/5651732.html
jQuery在1.5版本之后,引入了Deferred对象,提供的很方便的广义异步机制。详情可参看阮一峰老师的这篇文章 于是我用Deferred对象改写了代码,如下:
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);
});
});
可以看到我在ajax请求中去掉了async:false,也就是说,这个请求又是异步的了。另外请注意success函数中的这一句:defer.resolve(data),Deferred对象的resolve方法可传入一个参数,任意类型。这个参数可以在done方法中拿到,所以我们异步请求来的数据就可以以这样的方式来返回了。
至此,问题得到了解决。Deferred对象如此强大且方便,我们可以好好利用它。
PS:Firefox有做优化?
上述问题在chrome和IE9中测试结论一致。但是我在Firefox中测试时,同步ajax并未阻塞掉UI线程,也就是说这个问题根本不存在。我用其他代码做了测试,在Firefox中js线程确实是会阻塞UI线程,这个没有疑问。那可能的一个猜测就是Firefox对同步ajax做了优化,事实到底是什么,我暂未得知。有高人知道还请指点。