2011-04-09 81 views
0

我正在開發一個JavaScript代碼以使用ANT Galio瀏覽器在嵌入式設備上運行。XmlHttpRequest返回狀態4太快

理想情況下,我想讓代碼向另一臺服務器發出獲取請求。在獲取請求之後,該頁面將不允許用戶提交另一個獲取請求,直到從前一個獲取請求收到響應爲止。

出於某種原因,有時候我幾乎立刻就會收到4個readyState。就好像它正在評估以前的XmlHttpRequest對象而不是新的對象。我究竟做錯了什麼?

<script type="text/javascript"> 

var fail= function (env, resp, stat) { 

     alert(resp); 
}; 
var succ= function (env, resp) { 
}; 

var canScan = true; 

/* start scan */ 
function scan (name) { 
     if (canScan) { 
       //deactivate button 
       deactivateScanButtons(); 
       //let server know 
       ajax = new XMLHttpRequest(); 
       var scanUrl = 'http://19X.1XX.X.XX:8080/scan/' + name 
       ajax.open('GET', scanUrl, true); 
       ajax.onreadystatechange = function() { 
         if (ajax.readyState==4) { 
           //allow button to work again 
           activateScanButtons(); 
           alert("ready state 4"); 


         }; 
       }; 

       ajax.send(); 
//initiate scan 
       xrxScanInitiateScan(
         'http://127.0.0.1', 
         "ftp.xst", 
         false, 
         succ, 
         fail); 
     } 

} 

function deactivateScanButtons() { 
//  canScan = false; 

     var indicator = document.getElementById('buttons'); 
     indicator.style.visibility = "hidden"; 
} 
function activateScanButtons() { 
//  canScan = true; 

     var indicator = document.getElementById('buttons'); 
     indicator.style.visibility = "visible"; 

} 
</script> 

回答

1

3建議:

  1. 爲了避免客戶端的任何緩存中,添加一個隨機生成的號碼,或當前時間戳請求查詢字符串。
  2. 正如Yoni所說,用var關鍵字啓動您的XMLHttpRequest對象。
  3. 對於每個請求,將當前時間戳保存在全局變量中。在onreadystatechange中,僅當全局時間戳與該給定請求的相應時間戳匹配時才調用activateScanButtons。這樣,只有最新的請求才能撥打activateScanButtons
+0

這工作得很好。謝謝。 – SLY 2011-04-13 11:13:37

1

您在scan函數定義的Ajax對象沒有收到var關鍵字。這意味着它是一個全局對象,不是本地的。之後,你有一個關閉 - 你在onreadystate回調函數中引用該變量。

我發現很難跟蹤到底發生了什麼,但我同意你的看法,就像你在問題中所說的那樣,回調並沒有按照你期望的方式使用ajax對象。你說它有時會發生 - 當你幾乎同時發出兩個請求(雙擊一個按鈕或以非常快的速度觸發兩個請求時)會發生嗎?

我建議您在定義ajax對象之前使用var關鍵字。更好的是,在回調函數中嘗試使用this,而不是按名稱引用ajax對象。如果它有效,你可以避免一次關閉。