ajax請求後臺有時走有時不走

ajax請求後臺有時走有時不走

 
ajax請求後臺有時走有時不走,是由於沒有將請求設置爲同步方式,async:false,(默認爲true即異步)。若是不想使用緩存能夠將cache:false,例如:$.ajax({  
                    url : url,  
                    cache:false,  
                    async:false,
                    dataType : 'json',  
                    success : function(msg) {  
                     
                    }  
                }); 
 
 

問題:html

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

緣由:ajax

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

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

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

1、async值爲true (異步)異步

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

複製代碼
$.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()。函數

2、async值爲false (同步)url

當執行當前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。

原文:https://yq.aliyun.com/ziliao/107005

相關文章
相關標籤/搜索