標籤:change pre 注意 amp 線程 url res pen 屬性
昨天下午做項目遇到一個問題,貼出來方便以後翻閱,也給大家個參考。
問題:
具體做的是個檔案匯入的功能,匯入的功能是成功了,但是介面一直得不到傳回值,排查了一下午,調試的時候是可以有返回的,但是關掉瀏覽器調試介面,卻得不到返回結果。
原因:
一直以為是我背景程式有問題,晚上回到家才想起來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"); //不緩衝Ajaxxmlhttp.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
ajax請求後台,有時收不到傳回值的解決辦法