问题描述:在ajax请求数据时,有时候我们需要在获取到数据之后再进行页面渲染,这时我们需要使用同步模式(async:false);在我们请求数据过程中会使用loading来显示等待状态,然而,在同步模式下,loading状态无法显示。原因就是ajax的async设置为false时浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。

解决方法:

使用jquery的$.Deferred()和$.when().done()来实现异步下达到同步执行的效果,如下图所示:
deferred对象就是jQuery的回调函数解决方案;
deferred对象的含义就是"延迟"到未来某个点再执行;
deferred对象有三种执行状态----未完成,已完成和已失败。如果执行状态是"已完成"(resolved),deferred对象立刻调用done()方法指定的回调函数;如果执行状态是"已失败",调用fail()方法指定的回调函数;如果执行状态是"未完成",则继续等待。

function exportAjax (params) { 
    $(".loadingTip").removeClass("loadingHide").addClass("loadingShow"); 
    $.when(getAjaxData(params)).done(function (data) {
        $(".loadingTip").removeClass("loadingShow").addClass("loadingHide"); 
         if (data.code == 9000) {
             objData = data.data.List; 
             renderAllTable(objData); 
             method5('allTable','导出表名'); 
         } else { 
             myAlert('',data.message);  
         }
    })
} 
function getAjaxData(params) { 
    let defer = $.Deferred();  
    ajaxGetAll ({
        url: '/admin/statistics/Statisticsuserreg/add', 
        async: true, 
        data: params, 
        success: function (data) {
            defer.resolve(data);  
        }
    }) 
    return defer
} 


09-02 20:05