2014-06-18 56 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); 
    }); 
});