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