繁体   English   中英

jQuery AJAX结果块不会立即触发

[英]jQuery AJAX Result Block Doesn't Fire Immediately

我在循环内部有一个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循环将继续运行,并记录Do stuff
除非你在循环中做了疯狂的事情,否则循环将比服务器响应更快
就像Jan Dvorak提到的那样,即使你做了疯狂的事情,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)
           }
        });
}

照顾变量..可以在这里创建闭包......

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM