我有2个不同的 XMLHttpRequest 对象向同一个Web服务发出异步请求。 Web服务在HTTP响应头中发回一个cookie,我可以使用chrome.cookies.read扩展名读取该请求(该请求是跨域的)。
每个xhr按名称读取相同的cookie,但每个响应后cookie的值将不同,因为它是每个请求者的唯一标记。
所以我想在收到HTTP响应之后,每个请求存储每个cookie值,以供以后使用。
所以这就是我的代码目前正在做的事情:
var my_cookie_value = [] ;
function begin()
{
for (var i = 0 ; i < 2 ; i ++)
{
sendRequest(some_url, i);
}
}
function sendRequest(some_url, thread)
{
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
readCookie(thread) ;
}
}
xmlhttp.open("GET", some_url, true);
xmlhttp.send();
}
function readCookie(thread)
{
chrome.cookies.get(
{
"url" : some_domain,
"name" : "mycookie"
},
function(cookie)
{
if (cookie != null)
{
my_cookie_value[thread] = cookie.value ;
}
}
);
}
但是因为chrome.cookies.read使用了一个没有保证时间触发的回调函数,所以我发现每个线程都会混淆(或重复)cookie值,即使它们是作为不同的值从服务器返回的。
我认为可能发生的事情是:
线程0发送请求
线程1发送请求
线程0收到响应
线程0请求cookie值回调
Arrgghh !! ......最糟糕的情况即将来临......
线程1收到响应
线程1请求cookie值回调
线程0 cookie回调激活和cookie值(FOR THREAD 1)被复制到my_cookie_value [0]
线程1 cookie回调fires和cookie值(FOR THREAD 1)被复制到my_cookie_value [1]
这显然不是我想要的。 my_cookie_value [0]和[1]都包含线程1的标记。
最后问题是:还有另一个解决方案吗?我无法重写服务器代码,我只能访问客户端。
我想知道为什么为什么要通过回调函数读取cookie?
答案 0 :(得分:0)
设置var,跟踪当前是否有活动请求。像var currentRequest = false
之类的东西,在开始请求之前将其设置为true,并在请求完成后将其设置为false。在开始请求之前,检查是否存在活动请求,是否存在延迟或创建待处理请求队列。