jQueryAjax同步異步
今天在項目開發過程中,要實現這么一個功能
<!-- 當我點擊就業的時候,觸發onclick時間,check()方法里通過ajax請求返回數據, 如果該用戶已經畢業可以跳轉到job.html如果沒有畢業不能跳轉頁面同時彈框提示 --> <a href="job.html" onclick="return check()">就業</a>
我們都知道onclick是優先執行于href屬性的,只有onclick返回true才會執行href。接下來看js怎么寫的
function check(){ var fal=false; $.post("URL", function(date){ if(date==null || date==""){ fal=true; return fal;//其實這個return也只是返回ajax中function的返回值。而不是check()的返回值 }else{ alert("請先畢業才能就業") } }) return fal; /*最終發現如果該用戶已經畢業,a標簽沒有任何反應, 如果還沒有畢業,會提示:請先畢業才能就業。界面也是沒有反應*/ }
這就很納悶了,明明返回數據是空,fal變成了ture,怎么最終返回還是false。這就是同步和異步的區別了。
首先,ajax默認情況下是異步的,那什么是異步呢
async默認的設置值為true,這種情況為異步方式,就是說當ajax發送請求后,在等待server端返回的這個過程中,前臺會繼續 執行ajax塊后面的腳本,直到server端返回正確的結果才會去執行success,也就是說這時候執行的是兩個線程,ajax塊發出請求后一個線程 和ajax塊后面的腳本(另一個線程)
js舉例:
$(function() { $.ajax({ type : \'post\', async : true, url : \'\', cache : false, data : {}, success : function(data){ alert("1111"); } }); alert("22222"); }); /*在這里方法中,因為它是異步的,所以它在通過ajax向后端交互的同時,它還會向下執行js代碼,就相當于有兩個線程 所以這里是會先彈出"2222",才會彈出"1111",到這個時候,才知道為什么上面js為什么總是返回false,因為異步的時候 它先執行了下面的return fal,就已經返回flase了*/
所以我們只要把async的屬性值改為false就變成同步了
$.post沒有這個同步異步設置 ,如果一定要設置異步,只能在執行$.post之前加$.ajaxSettings.async = false; (同步執
行)
所以把最上面js改成同步,就可以實現相關功能了
function check(){ var fal=false; $.ajax({ type: "POST", url: "url", async:false, //同步方式 success: function(re){ if(re==null||re==""){ fal=true; }else{ alert("請先畢業才能就業"); } } }); return fal; }
同步和異步的區別
簡單理解:同步的意思是當JS代碼加載到當前AJAX的時候會把頁面里所有的代碼停止加載,頁面出去假死狀態,當這個AJAX執行完畢后才會繼續運行其他代碼頁面假死狀態解除。
而異步則這個AJAX代碼運行中的時候其他代碼一樣可以運行。
異步:在異步模式下,當我們使用AJAX發送完請求后,可能還有代碼需要執行。這個時候可能由于種種原因導致服務器還沒有響應我們的請求,但是因為我們采用了異步執行方式,所有包含AJAX請求代碼的函數中的剩余代碼將繼續執行。如果我們是將請求結果交由另外一個JS函數去處理的,那么,這個時候就好比兩條線程同時執行一樣。
同步:在同步模式下,當我們使用AJAX發送完請求后,后續還有代碼需要執行,我們同樣將服務器響應交由另一個JS函數去處理,但是這時的代碼執行情況是:在服務器沒有響應或者處理響應結果的JS函數還沒有處理完成return時,包含請求代碼的函數的剩余代碼是不能夠執行的。就好比單線程一樣,請求發出后就進入阻塞狀態,知道接觸阻塞余下的代碼才會繼續執行。
如果哪里理解不到位,或者理解錯了,歡迎指點。
想的太多,做的太少,中間的落差就是煩惱,要么去做,要么別想 少尉【17】