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

标签 javascript cookies xmlhttprequest google-chrome-extension

我有 2 个不同的 XMLHttpRequest 对象向同一个 Web 服务发出异步请求。 Web 服务在 HTTP 响应 header 中发回一个 cookie,我可以使用 chrome.cookies.read 扩展读取该 cookie(该请求是跨域的)。

每个 xhr 按名称读取相同的 cookie,但每次响应后 cookie 的值都会不同,因为它是每个请求者的唯一 token 。

所以我想在收到 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值回调

啊啊啊!!...最坏的情况即将到来...

线程1收到响应
线程1请求cookie值回调

线程 0 cookie 回调触发,并且 cookie 值(对于线程 1)被复制到 my_cookie_value[0]
线程 1 cookie 回调触发,并且 cookie 值(对于线程 1)被复制到 my_cookie_value[1]

这显然不是我想要的。 my_cookie_value[0] 和 [1] 都包含线程 1 的 token 。

最后的问题是:还有其他解决方案吗?我无法重写服务器代码,我只能访问客户端。

我想知道为什么哦为什么读取cookie是由回调函数完成的?

最佳答案

设置 var 来跟踪当前是否有事件请求。类似 var currentRequest = false 并在启动请求之前将其设置为 true,并在请求完成后将其设置为 false。在开始请求之前,检查是否存在事件请求以及是否存在延迟或创建待处理请求队列。

关于javascript - 使用 chrome.cookies 扩展响应 cookie 和 2 个异步 xmlhttp 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399627/

相关文章:

javascript - 如何使用一系列异步请求的结果填充数组

javascript - (CORS) 浏览器如何知道何时进行飞行前请求

javascript - 如果我不知道响应类型,我可以执行 XMLHttpRequest 吗?

javascript - 刷新 CSS 样式? (重绘页面)

php - css 因未知原因覆盖 php

javascript - 有没有一种优雅的方法可以将变量名中的单个单词提取到数组中?

cookies - cookie域中的点前缀是什么意思?

swift - WKNavigationResponse 不再通过其 response.header 提供对 cookie 的访问

javascript - 如何将此数组转换为对象数组?

javascript:表单不会仅在 IE 中提交,但是它适用于所有其他浏览器