解決ajax請求後臺,有時收不到返回值的問題

今天小編就爲大家分享一篇解決ajax請求後臺,有時收不到返回值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

昨天下午做項目遇到一個問題,貼出來方便以後翻閱,也給大家個參考。

問題:

具體做的是個文件導入的功能,導入的功能是成功了,但是界面一直得不到返回值,排查了一下午,調試的時候是可以有返回的,但是關掉瀏覽器調試界面,卻得不到返回結果。

原因:

一直以爲是我後臺程序有問題,晚上回到家纔想起來ajax的問題,把ajax的異步處理改爲同步,就出來效果了,具體的原因請看下文詳解。

jquery中ajax方法有個屬性async用於控制同步和異步,默認是true,即ajax請求默認是異步請求,有時項目中會用到AJAX同步。這個同步的意思是當JS代碼加載到當前AJAX的時候會把頁面裏所有的代碼停止加載,頁面出現假死狀態,當這個AJAX執行完畢後纔會繼續運行其他代碼頁面假死狀態解除。而異步則這個AJAX代碼運行中的時候其他代碼一樣可以運行。

ajax中async這個屬性,用於控制請求數據的方式,默認是true,即默認以異步的方式請求數據。

一、async值爲true (異步)

當ajax發送請求後,在等待server端返回的這個過程中,前臺會繼續 執行ajax塊後面的腳本,直到server端返回正確的結果纔會去執行success,也就是說這時候執行的是兩個線程,ajax塊發出請求後一個線程 和ajax塊後面的腳本(另一個線程)

$.ajax({ 
  type:"POST", 
  url:"Venue.aspx?act=init", 
  dataType:"html", 
  success:function(result){ //function1()
  f1(); 
  f2(); 
 } 
  failure:function (result) { 
  alert('Failed'); 
  }, 
 } 
 function2();

在上例中,當ajax塊發出請求後,他將停留function1(),等待server端的返回,但同時(在這個等待過程中),前臺會去執行function2()。

二、async值爲false (同步)

當執行當前AJAX的時候會停止執行後面的JS代碼,直到AJAX執行完畢後時,才能繼續執行後面的JS代碼。

$.ajax({ 
  type:"POST", 
  url:"Venue.aspx?act=init", 
  dataType:"html", 
  async: false,
 success:function(result){ //function1()
  f1(); 
  f2(); 
  } 
 failure:function (result) { 
  alert('Failed'); 
  }, 
 } 
 function2(); 

當把asyn設爲false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發出請求後,他會等待在function1()這個地方,不會去執行function2(),直到function1()部分執行完畢。

Ajax同步與異步的區別

var returnValue = null; 
xmlhttp = createXmlHttp(); 
xmlhttp.onreadystatechange = function() { 
 if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
 if (xmlhttp.responseText == "true") { 
  returnValue = "true"; 
 } 
 else { 
  returnValue = "false"; 
 } 
 } 
}; 
xmlhttp.open("Post",url,true); //異步傳輸 
xmlhttp.setRequestHeader("If-Modified-Since","0"); //不緩存Ajax
xmlhttp.send(sendStr); 
return returnValue;
在異步時纔可以用xmlHttpReq.onreadystatechange狀態值!下面是異步和同步的不同調用方式:

xmlHttpReq.open("GET",url,true);//異步方式
 xmlHttpReq.onreadystatechange = showResult; //showResult是回調函數名
 xmlHttpReq.send(null);
function showResult(){ 
 if(xmlHttpReq.readyState == 4){ 
 if(xmlHttpReq.status == 200){
 ******
 }
 }
}
xmlHttpReq.open("GET",url,false);//同步方式 
  xmlHttpReq.send(null); 
  showResult(); //showResult雖然是回調函數名但是具體用法不一樣~ 
function showResult(){ 
  //if(xmlHttpReq.readyState == 4){ 這裏就不用了,直接dosomething吧~ 
  //if(xmlHttpReq.status == 200){ 
   ******//dosomething 
  //} 
  //} 
}
xmlhttp.open("Post",url,true);

如果是同步(false),返回值是true或false,因爲執行完send後,開始執行onreadystatechange,程序會等到onreadystatechange都執行完,取得responseText後纔會繼續執行下一條語句,所以returnValue一定有值。

如果是異步(true),返回值一定是null,因爲程序執行完send後不等xmlhttp的響應,而繼續執行下一條語句,所以returnValue還沒有來的及變化就已經返回null了。

所有如果想獲得xmlhttp返回值必須用同步,異步無法得到返回值。

同步異步使用xmlhttp池時都要注意:取得xmlhttp時只能新建xmlhttp,不能從池中取出已用過的xmlhttp,因爲被使用過的xmlhttp的readyState爲4,所以同步異步都會send但不執行onreadystatechange。

以上這篇解決ajax請求後臺,有時收不到返回值的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章