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】