使用chrome.cookies扩展响应cookie和2个异步xmlhttp请求

时间:2011-03-23 00:44:33

标签: javascript cookies xmlhttprequest google-chrome-extension

我有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?

1 个答案:

答案 0 :(得分:0)

设置var,跟踪当前是否有活动请求。像var currentRequest = false之类的东西,在开始请求之前将其设置为true,并在请求完成后将其设置为false。在开始请求之前,检查是否存在活动请求,是否存在延迟或创建待处理请求队列。