1. 程式人生 > >解決同步Ajax頁面假死

解決同步Ajax頁面假死

在發起同步Ajax請求時設定的等待圖片在IE與Chrome瀏覽器不顯示,在firefox裡面正常,通過Chrome debug模式發現,它是會顯示的,由於後面的計算是JQuery同步操作,需要過長時間計算,導致介面UI卡死(來不及展示)。
瀏覽器的渲染(UI)執行緒和js執行緒是互斥的,在執行js耗時操作時,頁面渲染會被阻塞掉。當我們執行非同步ajax的時候沒有問題,但當設定為同步請求 時,其他的動作(ajax函式後面的程式碼,還有渲染執行緒)都會停止下來。即使DOM操作語句是在發起請求的前一句,這個同步請求也會“迅速”將UI線 程阻塞,不給它執行的時間。這就是程式碼失效的原因。
jQuery在1.5版本之後,引入了Deferred物件,提供的很方便的廣義非同步機制。
deferred物件就是jQuery的回撥函式解決方案,deferred物件的含義就是"延遲"到未來某個點再執行。
$.ajax()操作完成後,如果使用的是低於1.5.0版本的jQuery,返回的是XHR物件,你沒法進行鏈式操作;如果高於1.5.0版本,返回的是deferred物件,可以進行鏈式操作。
解決方法:使用JQuery Deferred物件。
var getWordCount = function(。。。){
        var defer = $.Deferred();
        var urlStr = "postcommit.html?I_SOURCE=getxliff";
        $.ajax({
            url : urlStr,             //async : false,表示非同步執行。
            success: function(dataStr){
                      defer.resolve(dataStr);
            }
        });        
        return defer.promise();
   }

var myTotalprice = function(。。。){
                           //當getWordCount() 執行完成後,執行done()以下操作。就跟同步效果一樣。
                          $.when(getWordCount(。。。)).done(function(dataStr){
                                       alert(dataStr);
                           });                   
   }