jQuery回调函数仅在最后一个循环中触发

时间:2012-08-05 13:41:52

标签: jquery loops for-loop closures

我知道还有其他问题可以解决同一个问题,但我找不到我理解的答案。

我试图通过循环遍历页面名称数组来读取页面数组,然后使用jQuery的$ .get函数来获取页面的内容。 我相信这是由于循环关闭,只有循环的最后一个回调触发。 但是,我不明白解决这个问题或如何解决这个问题,有人可以解释一下吗?

以下是代码:

function checkall2()
{
    i = 0;
    for(i in $servers) {
        $.get("servers/" + $servers[i], function(result) {
            alert(result + $servers[i]);
        });
    }
}

5 个答案:

答案 0 :(得分:4)

这是范围问题 - i正在被“覆盖”,并且当最终触发回调时,其值对于所有这些都是相同的。

由于您使用的是jQuery,因此可以使用迭代器:

$.each($servers, function(i, server) {
  $.get("servers/" + server, function(result) {
    alert(result + server);
  });
});
恕我直言,这看起来更加清晰。

答案 1 :(得分:3)

我认为这是一个范围问题 - 尝试并分配给循环中的本地,如下所示:

function checkall2()
{
    i = 0;
    for(i in $servers) {
        var server = $servers[i];
        $.get("servers/" + server, function(result) {
            alert(result + server);
        });
    }
}

已修改以显示正常工作$.each - > http://api.jquery.com/jQuery.each/

function checkall2()
{
    $.each($servers, function(index, server) {
        $.get("servers/" + server, function(result) {
            alert(result + server);
        });
    });
}

答案 2 :(得分:0)

你不能在循环中调用异步方法,而是这样做:

function checkall2(i)
{
    if(i< $servers.length) {
        $.get("servers/" + $servers[i], function(result) {
            alert(result + $servers[i]);
           checkall2(++i);
        });
    }
}

答案 3 :(得分:0)

var $servers = [1,2,3];
function checkall2()
{
    i = 0;
    for(i in $servers) {
       $.get("servers/" + $servers[i], function(result) {
         alert(result + $servers[i]);
      });
    }
 }
 checkall2();

这在我的机器上运行正常。您确定您的全局变量是否正常?

答案 4 :(得分:0)

好的我弄清楚它为什么不起作用。 谢谢佩德罗向我解释这个问题。 所以变量结果每次都不同,没有问题,只是因为所有三个文件的内容都相同,所以一旦我改了它们,我就意识到结果是不同的。

$ servers [i]每次都返回相同的原因,是因为一旦循环完成了回调,然后调用,那时我就在循环的末尾,所以它只返回$ server [2]三次(因为2是循环的结束)。