【问题标题】:jQuery callback function only firing on the last loopjQuery 回调函数只在最后一个循环触发
【发布时间】:2012-08-02 18:04:24
【问题描述】:

我知道还有其他问题解决了相同的问题,但我找不到我能正确理解的答案。

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

代码如下:

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

【问题讨论】:

  • 不,它是一个全局声明的 javascript 变量,它只是一个简单的字符串数组,包含服务器名称的不同单词,如 test1、test2、test3
  • 有些人用$前缀表示它是一个jQuery对象
  • 我只是对我的大多数 javascript 变量这样做,我猜这是一种习惯。
  • 只有请求成功才会触发回调,你确定是这样吗?
  • 与您的问题无关:尽可能避免使用全局变量,将它们包装在闭包中

标签: jquery loops for-loop closures


【解决方案1】:

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

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】:

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

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

    【讨论】:

    • $.ajaxSetup({ async: false });
    【解决方案3】:
    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】:

      这是一个范围问题 - i 正在被“覆盖”,当最终触发回调时,所有回调的值都将相同。

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

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

      恕我直言,这看起来更清晰。

      【讨论】:

      • 谢谢,我明白为什么现在出错了,这是因为所有回调在触发时 i 都是相同的,但您的解决方案似乎不起作用,出于某种原因永远不会调用警报。
      • 我用setTimeout 替换了$.get 调用,它似乎工作正常。在你的情况下它没有理由失败。有什么错误吗?
      • 不,没有错误,只是永远不会到达警报,如果我在警报的调试器中设置断点,它永远不会到达它
      • @PedroFerreira 这行不通,因为server 将包含数组的索引,您需要该项目的第二个参数-> $.each$(selector).each api.jquery.com/jQuery.each 的工作方式不同
      【解决方案5】:

      好的,我知道为什么它不起作用了。 谢谢佩德罗向我解释这个问题。 所以每次的变量结果都不一样,这没有什么问题,只是因为三个文件的内容都一样,所以我一改,结果就发现不一样了。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多