Javascript jqueryajax结果块不';不要立即开火

Javascript jqueryajax结果块不';不要立即开火,javascript,jquery,ajax,loops,xml-parsing,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).f

我在循环中有一个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调用。这意味着您的回拨:

function(xml) {
    $(xml).find('tag').each(function() {
        console.log('Do more stuff');
    });
}
仅在服务器返回响应时执行

同时,您的
for each
循环将继续运行,并且日志
执行操作

除非你在循环中做一些疯狂的事情,否则循环将比服务器响应更快

如前所述,即使您做了一些疯狂的事情,AJAX回调也会等待循环完成,从而导致
do stuff
总是出现在任何AJAX响应之前。

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

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

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

$.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)
           }
        });
}
var i=0;
callbackfunc(一){
log('Do stuff');
$.post($)https://blah.com/xml.php',
{arg:args[i]},
函数(xml){
$(xml).find('tag').each(function(){
//与xml数据相关的东西
});
log('Do more stuff');
i++;

if(我认为这里没有缓存任何内容。AJAX是一个异步调用,只有在调用完成并返回结果时才会执行Do more stuff。而for each是同步的,并以线性方式(在循环中)执行不会以这种方式运行…当AJAXsuccess返回时,这里会执行其他代码..其异步调用..其行为符合预期。如果您希望您的ajax调用以串行方式启动,请查看延迟以对其进行排序。哦,伙计,这非常有意义。使用$.ajax和complete/success/error回调。即使他正在做一些疯狂的事情,服务器响应也是如此将等待循环完成。给出了这个问题的答案,因为这是第一个清晰简洁的回答。感谢所有人的帮助。@PolishHurricane..那么,当他刚刚建议回调,我为你编写回调代码时,为什么你向我下箭头呢?将
i+1
作为参数传递会更容易;-)