jQuery AJAX结果块不会立即触发

时间:2012-11-30 13:50:28

标签: javascript jquery ajax loops xml-parsing

我在循环中有一个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的结果?它似乎像往常一样异步运行,但在这种情况下我不希望这样。

4 个答案:

答案 0 :(得分:3)

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

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

仅在服务器返回响应时执行。

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

答案 1 :(得分:1)

你的ajax调用是异步的,这意味着启动了ajax调用,然后继续执行更多代码的执行流程。它不会等待响应。当最终收到响应时,将执行回调。

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

如果你有很多电话,这比在需要时立即解决它们要慢得多,因为浏览器可以同时轻松处理多个ajax呼叫。

答案 2 :(得分:1)

$ .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)
           }
        });
}

处理变量..可以在这里创建闭包......

答案 3 :(得分:0)

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