Ajax函数进入循环

时间:2013-04-29 09:50:36

标签: javascript jquery ajax loops

我要求你回答我遇到的问题(部分是数组):

for(i=1;i<part.length;i++){
    $("#content").append('<div id="id' + i + '"></div>');
    $.get('ajax.php?id=' + i, function(data) {
        console.log("cache" + i);
        $("#id" + i).html(data);
    });
});

问题是进入$.get函数时,i值是循环结束时的I值。由于我的数组(部分)中有140行,我将始终为140,而不是1然后是2然后是3 ..

如何在ajax回调中获取i值?

感谢您的回复。

4 个答案:

答案 0 :(得分:2)

或者,从服务器获取JSON并迭代它:

$.get('ajax.php', { from: 1, to: 140 } ).done(function(data) {
    $(data).each(function(index) {
        //do something with this and index
    });
});

这样您就可以在内部访问索引,并且只会向服务器发出一个请求,从而不会污染网络。

答案 1 :(得分:0)

由于AJAX调用是异步的,所有回调都在循环之后运行。

您可以使用函数表达式为每次迭代创建单独的变量:

for(i=1;i<part.length;i++){
  $("#content").append('<div id="id' + i + '"></div>');

  (function(i){

    $.get('ajax.php?id=' + i, function(data) {
      console.log("cache" + i);
      $("#id" + i).html(data);
    });

  })(i);

});

答案 2 :(得分:0)

请注意,您的循环将尝试在您的浏览器允许的情况下同时触发尽可能多的AJAX请求,但不保证它们将以任何特定顺序完成。

如果你真的必须发起140个AJAX请求,我建议这样做,而不是:

var i = 1;
(function loop() {
    if (i < part.length) {
        $("#content").append('<div id="id' + i + '"></div>');
        $.get('ajax.php?id=' + i).done(function(data) {
            console.log("cache" + i);
            $("#id" + i).html(data);
            i++;
        }, loop);
     }
});

答案 3 :(得分:-1)

Guffa他的答案应该有效,您也可以使用$.ajax - 版本并将async-parameter设置为false。查看文档以了解如何使用它。

编辑:应该注意的是,使用async: false是一种不好的做法,将被弃用。