jQuery AJAX请求中的变量范围?

时间:2014-06-18 13:09:51

标签: javascript 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调用的匿名函数没有?匿名函数在哪里被定义?

3 个答案:

答案 0 :(得分:2)

那是因为

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

是异步的。

function(data) {
    test += 1;
}   
所有代码执行完毕后都会调用

答案 1 :(得分:1)

JQuery each的回调是同步的。

JQuery Ajax (异步javascript和xml)的回调是异步的。

如果你想让ajax函数同步,你可以这样做:

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

答案 2 :(得分: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);
    });
});