[英]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.