【问题标题】:jQuery AJAX Result Block Doesn't Fire ImmediatelyjQuery AJAX 结果块不会立即触发
【发布时间】:2012-11-18 18:04:49
【问题描述】:

我在循环中有一个 jQuery POST 函数(多个 post 调用)。
出于某种原因,jQuery 正在发布,但在循环结束并立即解析所有结果之前不会返回所有数据。

FOREACH arg_value IN args
{
console.log('Do stuff');

    $.post('https://blah.com/xml.php',
           {arg: arg_value},
           function(xml) {
                $(xml).find('tag').each(function() {
                        console.log('Do more stuff');
                });
           });
}

这个的输出是……

做事
做事
做事
做更多的事情
做更多的事情
做更多的事情

似乎 jQuery 正在缓存结果或直到最后才执行它。

我期待...

做事
做更多的事情
做事
做更多的事情
做事
做更多的事情

有没有一个选项可以告诉 jQuery 暂停执行,直到 AJAX 有结果?它似乎像往常一样异步运行,但在这种情况下我不希望这样。

【问题讨论】:

  • 我认为这里没有缓存任何内容。 AJAX 是一个异步调用,只有在调用完成并返回结果时才会执行更多操作。虽然您的 for each 是同步的并且线性执行(在循环中)
  • 不会那样运行...当 AJAXsuccess 返回时,这里会执行其他代码...它的异步调用...
  • 这符合预期。如果您希望您的 ajax 调用以串行方式触发,请查看 deferreds 以对其进行排序。
  • 天哪,这很有道理。
  • 使用 $.ajax 和完成/成功/错误回调。

标签: javascript jquery ajax loops xml-parsing


【解决方案1】:

AJAX 调用是异步的。这意味着您的回调:

function(xml) {
    $(xml).find('tag').each(function() {
        console.log('Do more stuff');
    });
}

只有在服务器返回响应时才会执行。

同时,您的 for-each 循环将继续运行,并记录 Do stuff
除非您在循环中做疯狂的事情,否则循环将比服务器响应更快
就像Jan Dvorak 提到的那样,即使你做了疯狂的事情,AJAX 回调也会等待循环完成,导致Do stuff 总是出现在任何 AJAX 响应之前。

【讨论】:

  • 即使他在做疯狂的事情,服务器响应也会等待循环结束。
  • 给了这个答案,因为这是第一个清晰简洁的回应。感谢大家的帮助。
  • @PolishHurricane..那么,当他刚刚建议回调而我为你编写回调代码时,为什么你向下箭头我?
【解决方案2】:

您的 ajax 调用是异步的,这意味着 ajax 调用被触发,然后进一步代码的执行流程继续。它不会等待响应。当最终收到响应时,将执行回调。

您可以做的是让您的 ajax 调用全部堆叠在一个队列中,并在收到每个响应时触发队列中的下一个调用。这将实现您想要的效果,即在当前调用完成之前不会发送下一个 ajax 调用。

如果您有很多调用,这将比在需要时立即将它们全部关闭要慢得多,因为浏览器可以轻松地同时处理多个 ajax 调用。

【讨论】:

    【解决方案3】:

    $.post() 是异步调用...不会以您想要的方式循环工作..要获得您想要的方式..这是解决方案..

    var i=0;
    callbackfunc(i) {
    console.log('Do stuff');
    $.post('https://blah.com/xml.php',
            {arg: args[i]},
            function(xml) {
                $(xml).find('tag').each(function() {
                  //something related to xml data  
                });
                 console.log('Do more stuff');
                  i++;
                  if(i<args.length)callbackfunc(i)
               }
            });
    }
    

    注意变量..可以在这里创建闭包...

    【讨论】:

    • i+1 作为参数传递会更容易;-)
    【解决方案4】:

    你在这里是异步的,如果你想这样做可能最简单的方法是使用async.js

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多