在項目開發過程中,要實現這麼一個功能
<!-- 當我點擊就業的時候,觸發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塊後面的腳本(另一個線程)
$(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時,包含請求代碼的函數的剩餘代碼是不能夠執行的。就好比單線程一樣,請求發出後就進入阻塞狀態,知道接觸阻塞餘下的代碼纔會繼續執行。