У меня есть 2 разных XMLHttpRequest объекта, делающих асинхронные запросы к одному и тому же веб-сервису.Веб-служба отправляет файл cookie в заголовках ответа HTTP, который я могу прочитать с расширением chrome.cookies.read (запрос является междоменным).
Каждый xhr читает один и тот же файл cookie по имени, нозначение cookie после каждого ответа будет отличаться, так как это уникальный токен для каждого запрашивающего.
Поэтому я хочу сохранить каждое значение cookie для каждого запроса, только после получения ответа HTTP, для последующего использования.
Итак, вот что мой код делает в данный момент:
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]
поток обратных вызовов cookie потока 1, а значение cookie (FOR THREAD 1) копируется в my_cookie_value [1]
Это obvне то, что я хотел.my_cookie_value [0] и [1] содержат токен для потока 1.
Итак, наконец, вопрос: есть ли другое решение для этого?Я не могу переписать код сервера, я могу получить доступ только к клиенту.
Мне интересно, почему, почему чтение куки выполняется функцией обратного вызова ??