合并多个jQuery ajax调用对先到先得的基本调用的响应?

时间:2011-07-17 05:36:20

标签: jquery parallel-processing

我正在创建一个网页,在$(document).ready事件中发出三个jQuery ajax调用。并且网页在先到先服务的基础上成对地合并这三个调用的响应(例如,如果它们首先返回则合并响应1和3。在返回之后将响应2与1或3中的任何一个合并)。

如何实施?如果我使用变量存储ajax调用状态,如何避免竞争?

2 个答案:

答案 0 :(得分:0)

您必须分别为每个响应创建一个存储状态的位置,其中所有响应都可以看到所有状态(因此没有竞争条件)。然后,在每次ajax调用完成后,检查之前已完成的内容。如果已经足够完成以显示响应,则处理该响应并设置剩余的ajax响应可能需要查看的任何新状态。不知道你的代码结构,最简单的方法就是一个简单的数组:

var ajaxResponses = [null, null, null];       // response values for 3 ajax calls
var ajaxProcessed = [false, false, false];    // keep track of which values have been merged
var ajaxMergeResult = null;                   // what's been merged so far

然后,每个ajax调用的每个完成函数都可以将它的响应数据放入数组中,然后调用doMerge()函数来查看到目前为止收到的状态,以检查是否有足够的先前数据来完成工作或做一些工作。如果它做了一些工作,但所有的调用还没有完成,它必须存储已经完成的工作,这样当最后一个完成时,下一次调用doMerge()知道到目前为止已经完成了什么,它只需要完成这项工作。

答案 1 :(得分:0)

JavaScript中没有竞争,因为JavaScript不是并行的。当谈到HTTP请求时,它是异步,这是完全不同的。

先来,先发球就像它一样直截了当:

var responses = [];
var urls = ["url1", "url2", "url3"];

for (var i=0, j=urls.length; i<j; i++) {
  $.ajax({ 
    url: urls[i],
    success: function (data) {
      responses.push(data);
    }
  });
}

进行。