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