我遇到了一个非常神秘的问题。我正在尝试实现一个购物车,通过在客户端存储cookie来标识已订购商品的ID和数量。当我加载结算HTML页面时,我会读取cookie并逐个获取项目ID;然后对于每个项目ID,我都会向我的servlet发送请求以返回信息。为了简单起见,我已经删除了冗余行:
var arrXhr = new Array();
function ProcessCheckout(){
try
{
var myArr = new Array();
myArr[0]=84234;
myArr[1]=84239;
myArr[2]=84240;
for (var intLoop=0; intLoop < myArr.length; intLoop++){
var intIcint=myArr[intLoop];
arrXhr[intIcint]= new XMLHttpRequest();
function Populate_CheckOutCart(){
arrXhr[intIcint].open('POST', strRemoteUriReq, true);
arrXhr[intIcint].send(null);
arrXhr[intIcint].onreadystatechange= ProcessSrvRsp(intIcint);
}
}catch(errors)
{
alert(errors.message);
}
}
}
function ProcessSrvRsp(ItemToProcess){
if (arrXhr[ItemToProcess].readyState==4){
//doing some functionality here on item code: ItemToProcess
}
}
这里的问题在于第
行。
arrXhr[intIcint].open('POST', strRemoteUriReq, true);
如果我把请求类型从“同步”通信更改为“异步”,即从“TRUE”更改为“FALSE”,则一切都可以正常工作,但是您知道网页将不得不等待服务器处理每个项目。因此,网页将发送一个项目84234的请求,等待响应后再发送一个项目84239的请求,以此类推。
据我的了解,如果我改回使用“异步”XMLHttpRequest,则只有在arrXhr [ItemToProcess] .readyState == 1时才会发生任何事情。但是对于其他状态,2,3,4(4是最重要的开始工作的),它们从未被触发。
有什么想法吗?最重要的是我们如何克服这个问题?我知道XMLHttpRequest在单独的线程上工作,很可能这是问题所在,但我想不出解决方案。
我的目标很简单,我希望我的网页在从磁盘上的cookie读取时立即向我的servlet发送多个请求;因此,对于每个cookie,我都想发送一个请求,并希望以异步方式接收响应。我不希望浏览器等待直到完成最终请求。因此,如果您有任何其他想法/实现方法,我可以是一个非常开放的人;)
附言:我正在使用TomCat 7