Ajax請求中的async:false/true的作用

最近做東西用到ajax,我在火狐下firebug打斷點一點問題都沒有,可是關了firebug,程序不進後臺方法,納悶了好久,從來沒有遇到過這種情況,最後加了一個參數async:false好了,還是
很納悶,以前寫了那麼多ajax相關代碼從來沒遇到過這種情況,原來對asy:nc:false的含義不大瞭解,還有可能和現在這個平臺有關係吧。
async boolean default: true
by default, all requests are sentasynchronous (e.g. this is set to true by default). if you need synchronousrequests, set this option to false. note that synchronous
requests may temporarily lock the browser,disabling any actions while the request is active.
async. 默認是true,即爲異步方式,$.ajax執行後,會繼續執行ajax後面的腳本,直到服務器端返回數據後,觸發$.ajax裏的success方法,這時候執行的是兩個線程。若要將其設置爲false
,則所有的請求均爲同步請求,在沒有返回值之前,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成纔可以執行。
下面查看一個示例:
var temp;
$.ajax({
 async: false,
  type : "post",
  url : defaultpostdata.url,
  datatype : 'json',
  success : function(data) {
     temp=data;
  }
});
alert(temp);
這個ajax請求爲同步請求,在沒有返回值之前,alert(temp)是不會執行的。
如果async設置爲:true,則不會等待ajax請求返回的結果,會直接執行ajax後面的語句。

不過上面設置同步請求的方法,有網友曾經反饋將async設成false後, 原意是想返回數據了再執行$.ajax後面的腳本, 沒想到這個地方卻導致了在火狐瀏覽器下出現閃屏(firefox 11.0),滾動條下拉到底部觸發ajax的情況。最後只能將async:false註釋掉,也就是async爲ture的情況下,成功解決了火狐瀏覽器滾動條下拉到底部觸發ajax出現閃屏的問題。




 

test.html
<a href="javascript:void(0)" onmouseover="testAsync()">
asy.js

function testAsync(){
    var temp;
    $.ajax({
        async: false,
        type : "GET",
        url : 'tet.php',
        complete: function(msg){
            alert('complete');
        },
        success : function(data) {
            alert('success');
            temp=data;
        }
    });
    alert(temp+'   end');
}


tet.php
<?php
    echo "here is html code";
    sleep(5);
?>

async: false,(默認是true);
如上:false爲同步,這個 testAsync()方法中的Ajax請求將整個瀏覽器鎖死,
只有tet.php執行結束後,纔可以執行其它操作。

當async: true 時,ajax請求是異步的。但是其中有個問題:testAsync()中的ajax請求和其後面的操作是異步執行的,那麼當tet.php還未執行完,就可能已經執行了 ajax請求後面的操作,
如: alert(temp+'   end');
然而,temp這個數據是在ajax請求success後才賦值的,結果,輸出時會爲空。







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