昨天下午做項目遇到一個問題,貼出來方便以后翻閱,也給大家個參考。
問題:
具體做的是個文件導入的功能,導入的功能是成功了,但是界面一直得不到返回值,排查了一下午,調試的時候是可以有返回的,但是關掉瀏覽器調試界面,卻得不到返回結果。
原因:
一直以為是我后臺程序有問題,晚上回到家才想起來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請求后臺,有時收不到返回值的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持碩編程。