2014-06-18 59 views
0

好吧,我完全困惑。我敢肯定,這是一個範圍或一個封閉的事情,但可能有人解釋爲什麼jQuery AJAX請求中的變量範圍?

$(document).ready(function() { 
    var test = 0; 
    var whatev = [1,2,3,4,5]; 
    $.each(whatev, function(i, v) { 
     test += 1; 
    }); 
    alert(test); 
}); 

警報「5」和

$(document).ready(function() { 
    var test = 0; 
    var whatev = [1,2,3,4,5]; 
    $.each(whatev, function(i, v) { 
     $.ajax('http://example.com/').done(function(data) { 
      test += 1; 
     });    
    }); 
    alert(test); 
}); 

警報0?爲什麼$.each調用中的匿名函數有權訪問測試,但ajax調用的匿名函數沒有?匿名函數在哪裏被定義?

+2

每個等待是採用同步,也就是說Ajax調用是異步 – epascarello

+0

'$阿賈克斯( 'http://example.com/')'是異步的。 –

+0

@epascarello:AHHHH,對......有人沒有足夠的咖啡。 – Andrew

回答

1

JQuery each的回調是同步的。

然而,JQuery Ajax (異步JavaScript和xml)的回調是異步的。

如果你想在AJAX功能是同步的,你可以做到這一點是這樣的:

$.ajax({ 
    type: "GET", 
    url: "http://example.com/", 
    async: false 
}) 
+0

感謝您指出異步選項......現在就像一個魅力! – Andrew

2

這是因爲

$.ajax('http://example.com/').done(); 

是異步的。

function(data) { 
    test += 1; 
} 

在所有代碼執行完畢後被調用。

+0

D'oh,謝謝!今天很愚蠢...... – Andrew

+0

@安德魯恩,很高興幫助。 –

0

,你可以與回調的工作,一切都將等待

的Ajax回調和警報的循環等待爲完成循環

function request(callback){ 
     $.ajax('http://example.com/').done(function(data) { 

      callback(); 
     }); 
} 

var y = 0; 
function loop(whatev,callback){ 
    request(function(){ 
     test += 1; 
     y++; 
     if(y >= whatev.length){ 
      //stop looping and trigger callback (alert) 
      callback(); 
     }else { 
      loop(whatev); 
      } 
    }); 

} 

$(document).ready(function() { 
    var test = 0; 
    var whatev = [1,2,3,4,5]; 
    loop(whatev,function(){ 
     alert(test); 
    }); 
});