1

我有2個不同的XMLHttpRequest對同一Web服務發出異步請求的對象。 Web服務在HTTP響應頭文件中發回一個cookie,我可以用chrome.cookies.read擴展名讀取(請求是跨域的)。響應cookie和2個使用chrome.cookies擴展的異步xmlhttp請求

每個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值(線程1)被複制到my_cookie_value [0]
線程1周的cookie回調火災和cookie值(線程1)被複制到my_cookie_value [1]

這顯然不是我想要的。 my_cookie_value [0]和[1]都包含線程1的標記。

因此,最後問題:是否有另一種解決方案呢?我無法重寫服務器代碼,我只能訪問客戶端。

我想知道爲什麼哦,爲什麼要讀取一個由回調函數完成的cookie?

+0

可能沒有其他解決辦法,比讓xhr調用同步... – serg 2011-03-23 16:21:32

回答

0

設置跟蹤當前是否有活動請求的var。類似於var currentRequest = false,並在開始請求之前將其設置爲true,並在請求完成後將其設置爲false。在開始請求之前,請檢查是否存在活動請求,以及是否存在延遲或創建未決請求隊列。