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塊後面的腳本(另一個線程)


$(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時,包含請求代碼的函數的剩餘代碼是不能夠執行的。就好比單線程一樣,請求發出後就進入阻塞狀態,知道接觸阻塞餘下的代碼纔會繼續執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章