ответные куки и 2 асинхронных запроса xmlhttp с расширением chrome.cookies - PullRequest
1 голос
/ 23 марта 2011

У меня есть 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.

Итак, наконец, вопрос: есть ли другое решение для этого?Я не могу переписать код сервера, я могу получить доступ только к клиенту.

Мне интересно, почему, почему чтение куки выполняется функцией обратного вызова ??

1 Ответ

0 голосов
/ 24 июня 2011

Установите var, который отслеживает, если у вас есть активный запрос. Что-то вроде var currentRequest = false и установите его в true перед началом запроса и установите в false после завершения запроса. Перед началом запроса проверьте, существует ли активный запрос и есть ли задержка или создайте очередь ожидающих запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...