【发布时间】:2011-09-29 09:27:27
【问题描述】:
我遇到了一个非常超自然的问题。我正在尝试实现一个购物车,我将 cookie 存储在客户端,以识别已订购的商品 ID 及其数量。当我加载结帐 HTML 页面时,我正在读取 cookie 并一个接一个地获取项目 ID;然后对于每个项目 ID,我将向我的 servlet 发送请求,该 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);
如果我将请求类型更改为 SYNCHRONOUS 通信,即从 TRUE 更改为 FALSE,一切正常,但正如您所知,网页将不得不等待服务器处理每个项目。因此,网页将发送对项目 84234 的请求,等待,当有响应时再发送对项目 84239 的请求,等等。
据我所知,如果我改回 ASYNCHRONOUS XMLHttpRequest,除了/仅当 arrXhr[ItemToProcess].readyState==1 时,什么都不会发生。但是对于其他状态,2,3,4(4 是最重要的开始工作),它们永远不会被触发。
知道为什么吗?最重要的是我们如何克服这个问题?我知道 XMLHttpRequest 在单独的线程上工作,很可能这是问题所在,但我无法找到解决方案。
我的目标很简单,我希望我的网页在读取磁盘上的 cookie 时同时向我的 servlet 发送多个请求;因此,对于每个 cookie,我想发送一个请求并期望以异步方式接收响应。我不希望浏览器一直等到最终请求完成。所以,如果你有任何其他的想法/实施,我可以是一个非常开放的人;)
附言我正在使用 TomCat 7
【问题讨论】:
-
只是评论:为什么不单独发送所有订购商品的请求?
标签: javascript ajax tomcat xmlhttprequest