我正在创建一个网页,在$(document).ready
事件中发出三个jQuery ajax调用。并且网页在先到先服务的基础上成对地合并这三个调用的响应(例如,如果它们首先返回则合并响应1和3。在返回之后将响应2与1或3中的任何一个合并)。
如何实施?如果我使用变量存储ajax调用状态,如何避免竞争?
答案 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);
}
});
}
进行。