1. 程式人生 > >ajax非同步提交後出現卡死現象

ajax非同步提交後出現卡死現象

本人是做電視節目站點開發,最近出現一個問題,非同步提交後,頁面一直在緩衝,出現卡死現象,

在電腦測試一切正常,感覺很鬱悶,程式碼什麼沒有問題,後發現是ajax問題。

ajax分為同步提交和非同步提交。以下是兩個方法區別。

非同步方法:

  1. function getJSON2(){  
  2.             var tmp;  
  3.             var xmlHttpRequest=createAjaxObject();  
  4.             xmlHttpRequest.open('GET',url,true);//GET即採用get方法,url為請求的地址,true設定為非同步,預設就是非同步,所以也可以不用寫
  5.             xmlHttpRequest.send(null);  
  6.             xmlHttpRequest.onreadystatechange = function(){  //註冊回撥函式
  7.                 //readyState有四種可能值:0——請求未初始化(在呼叫 open() 之前),1——請求已提出(呼叫 send() 之前),2——請求已傳送(這裡通常可以從響應得到內容頭部),3——請求處理中,4——請求已完成。
  8.                 if(xmlHttpRequest.readyState==4){  
  9.                     if
    (xmlHttpRequest.status == 200){  
  10.                         alert(xmlHttpRequest.responseText);  
  11.                         //var json = eval('('+xmlHttpRequest.responseText+')');
  12.                         //alert(json.Stops[0].StopName);
  13.                        //tmp = json.Stops[0].StopName;
  14.                        //alert(tmp);//有值
  15.                      }  
  16.                 }  
  17.             }  
  18.             //alert(tmp); //沒有值
  19.             xmlHttpRequest=null;  
  20.         }  
  21. 同步方法:
  1. function getJSON2(){  
  2.             var tmp;  
  3.             var xmlHttpRequest=createAjaxObject();  
  4.             xmlHttpRequest.open('GET',url,false);//GET即採用get方法,url為請求的地址,false設定為同步,預設就是非同步,所以也可以不用寫
  5.             xmlHttpRequest.send(null);  
  6.             var result = xmlHttpRequest2.status;  
  7.                     if(result == 200){  
  8.                         alert(xmlHttpRequest.responseText);  
  9.                         //var json = eval('('+xmlHttpRequest.responseText+')');
  10.                         //alert(json.Stops[0].StopName);
  11.                        //tmp = json.Stops[0].StopName;
  12.                        //alert(tmp);//有值
  13.             }  
  14.             //alert(tmp); //有值,成功,但是破壞了ajax非同步的初衷。
  15.             xmlHttpRequest=null;  
  16.         }  
總結:對於一些資料的獲取,同步必須要等到伺服器的響應。如果是非同步(true),返回值是null,因為程式執行完send後不等xmlhttp的響應,而繼續執行下一條js語句,所以tmp還沒有來的及變化就已經返回null了。所以如果想獲得xmlhttp返回值必須用同步,非同步無法得到返回值。 這就是為什麼我在後面的操作一直取不到這個函式的返回值的緣故了。ajax的同步破壞了ajax非同步的初衷,除非忘不得已(比如需要對響應的資料進行進一步處理)才使用。
 還有,同步非同步使用xmlhttp池時都要注意:取得xmlhttp時只能新建xmlhttp,不能從池中取出已用過的xmlhttp,(這種情況主要發生在需要迴圈的時候)因為被使用過的xmlhttp的readyState為4,所以同步非同步都會send但不執行onreadystatechange。