我正在使用JQuery进行ajax调用来获取数据。我正在做几次调用,逐步获取这些数据的peices。所以我有类似的东西:
for(i=0;i<numOfDataObjects;i++) {
$.ajax({
//get the data and do something with it in the success callback
});
}
我在循环之后有一些代码,我希望在所有ajax调用完成并且退出成功回调之后只执行。现在这没有发生,我猜是因为xhr对象的异步性质。
有没有办法在不增加每个ajax成功函数中的全局计数器(并检查它是否等于某个值),以确保在所有服务器调用完成后循环之后执行代码?
答案 0 :(得分:1)
您可以使用jQuery Message Queueing插件。将您需要处理的所有项目放入队列中。请注意文档中的complete
函数:
完成 :(功能)只要不再处理任何队列项,就会调用。完成后,如果添加了更多队列项并且队列再次完成,则将再次调用此函数。在此函数中,
this
引用queueObj对象。
将要运行的代码放在该处理程序中。
但有一点需要注意。我无法从文档中看出在为每个AJAX请求执行回调之后是否调用complete
处理程序,或者在队列中没有剩余项目要处理时立即调用它(无论是否有当前正在执行的AJAX请求)。
<强>更新强>
我似乎忽略了callback
功能:
回调 :(功能)为每个队列项或一批项目调用,每个延迟毫秒。此函数传递一个参数,如果批处理为1则为单个队列项,如果批处理为>,则为队列项数组。 1.如果回调返回true,则队列项将重新添加回队列的前面,以便下一次回调执行以重试。在此函数中,
this
引用queueObj对象。
我想你可以把你需要发送的所有内容放到一个批处理中,然后把你需要的代码放在callback
处理程序中。
答案 1 :(得分:1)
JavaScript语言的扩展名为StratifiedJS。它在每个浏览器中运行,它允许您以线性方式处理异步调用。
您可以启用分层JavaScript,例如在你的网页上加入Oni Apollo(http://onilabs.com/docs),如:
<script src="http://code.onilabs.com/latest/oni-apollo.js"></script>
<script type="text/sjs"> your StratifiedJS code here </script>
您的代码看起来像:
var http = require("http"); // a module wrapping XHR, part of Apollo
for(i=0;i<numOfDataObjects;i++) {
//get the data
var data = http.get(url);
// and do something with it
}
但是这会按顺序执行所有请求,您也可以并行执行所有请求(因此浏览器可以同时建立多个连接)并在完成所有操作后继续执行下一行:
function handleParallelRequests(urls) {
if (!urls.length) return;
waitfor {
var data = require('http').get(urls[0]);
// and do something with it
}
and {
// in parallel, do remaining requests:
// continue with the urls without the first we just handled.
handleParallelRequests(urls.slice(1));
}
}
handleParallelRequest(myurls);
// all request are finished when you get here.
解释了waitfor /和关键字