問題:
具體做的是個檔案匯入的功能,匯入的功能是成功了,但是介面一直得不到返回值,排查了一下午,除錯的時候是可以有返回的,但是關掉瀏覽器除錯介面,卻得不到返回結果。
原因:一直以為是我後台程式有問題,晚上回到家才想起來ajax的問題,把ajax的非同步處理改為同步,就出來效果了,具體的原因請看下文詳解。
jquery中ajax方法有個屬性async用於控制同步和非同步,預設是true,即ajax請求預設是非同步請求,有時專案中會用到ajax同步。這個同步的意思是當js**載入到當前ajax的時候會把頁面裡所有的**停止載入,頁面出現假死狀態,當這個ajax執行完畢後才會繼續執行其他**頁面假死狀態解除。而非同步則這個ajax**執行中的時候其他**一樣可以執行。
ajax中lvyookdoqasync這個屬性,用於控制請求資料的方式,預設是true,即預設以非同步的方式請求資料。
一、async值為true (非同步)
當ajax傳送請求後,在等待server端返回的這個過程中,前台會繼續 執行ajax塊後面的指令碼,直到server端返回正確的結果才會去執行success,也就是說這時候執行的是兩個執行緒,ajax塊發出請求後乙個執行緒 和ajax塊後面的指令碼(另乙個執行緒)
$.ajax(
failure:function (result) ,
} function2();
在上例中,當ajax塊發出請求後,他將停留function1(),等待server端的返回,但同時(在這個等待過程中),前台會去執行function2()。
二、async值為false (同步)
當執行當前ajax的時候會停止執行後面的js**,直到ajax執行完畢後時,才能繼續執行後面的js**。
$.ajax(
failure:function (result) ,
} function2();
當把asyn設為false時,這時ajax的請求時同步的,也就是說,這個時候ajax塊發出請求後,他會等待在function1()這個地方,不會去執行function2(),直到function1()部分執行完畢。
ajax同步與非同步的區別
xmlhttp.open("post",url,true); //非同步傳輸
xmlhttp.setrequestheader("if-modified-since","0"); //不快取ajax
在非同步時才可以用xmlhttpreq.onreadystatechange狀態值!下面是非同步和同步的不同呼叫方式:
xmlhttpreq.open("get",url,true);//非同步方式
xmlhttprelvyookdoqq.onreadystatechange = showresult; //showresult是**函式名
}}xmlhttpreq.open("get",url,false);//同步方式
showresult(); //showresult雖然是程式設計客棧**函式名但是具體用法不一樣~
如果是同步(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請求後台,有時收不到返回值的問題
本文位址:
Ajax 傳遞陣列後台接收不到資料問題解決方法
問題描述 前端使用ajax向後台提交資料 ajax datatype json success function data springmvc中使用陣列接收引數 public response delete long ids 然而ids陣列列印出來一直為空 原因分析 ajax傳遞引數時,缺省會深度序...
解決ajax傳過來的值後台接收不到的問題
問題描述 在前端js裡面寫了乙個ajax,前端alertx出來的是1或者1,2格式的資料,但是在後台取到的值一直都是null。js 如下 function confirmcoursesystem var coursesystemid coursesystemlist val alertx cours...
Android4 0有時接收不到開機廣播
經過分析測試發現,如果應用程式安裝上始終沒有被開啟過,那麼在android啟動時,該應用無法接收到開機啟動廣播android.permission.receive boot completed。android 3.1的更新文件中已經做了說明。下面是引自android官方api說明,位址 官方文件的部...