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同步请求浏览器假死问题的主要内容,如果未能解决你的问题,请参考以下文章

Ajax同步异步请求

ajax同步方式提交请求,beforeSend不起作用,即IE假死 代码如下:

Ajax同步与异步优缺点与适用情况。

ajax同步与异步的区别

ajax的同步与异步

Ajax同步和异步