JQuery Ajax控制流程

时间:2010-08-26 20:58:16

标签: javascript jquery ajax

我正在使用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成功函数中的全局计数器(并检查它是否等于某个值),以确保在所有服务器调用完成后循环之后执行代码?

2 个答案:

答案 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.

http://stratifiedjs.org/sjsdocs

解释了waitfor /和关键字