Javascript for循环奇怪的行为

时间:2013-01-06 13:47:30

标签: javascript jquery loops for-loop

我觉得我得到这个输出很奇怪:

Wait..
Request 2 Complete.
Request 2 Complete.

在简单的for循环中:

for (var i = 0, j = urls.length; i < j; i += 1) {
    $.ajax({
        url: urls[i],
        dataType: 'jsonp',
        complete: function() {
            log.append('Request ' + i + ' Complete.' + "\n");
            if (i == (j - 1)) {
                log.append('Done.');
            }
        }
    });

}

为什么i总是等于2

2 个答案:

答案 0 :(得分:6)

这是因为在ajax请求中对i的两次调用都引用了i循环的for。在时间点,当请求完成时(因此访问i)循环已终止且i具有最终值,此处为2

我认为你会找到这样的东西:

for (var i = 0, j = urls.length; i < j; i += 1) {
  !function( i ){
    $.ajax({
        url: urls[i],
        dataType: 'jsonp',
        complete: function() {
            log.append('Request ' + i + ' Complete.' + "\n");
            if (i == (j - 1)) {
                log.append('Done.');
            }
        }
    });
  }( i );
}

通过将i的值传递给立即执行的函数,您可以创建要在ajax-requests内使用的i的相应值的副本。

答案 1 :(得分:0)

尝试使用

     async = false;
in ajax request