2012-02-19 86 views
0

我有一個谷歌瀏覽器擴展程序,它在按下按鈕時執行xmlhttp請求到服務器。如果服務器關閉,我正在處理該錯誤。我想實現的是在越來越多的秒數後重試請求。我就這樣做:xmlhttp請求具有奇怪的行爲,並且狀態爲0

var execute = function(method, url, i){ 
      //if timeout doesn't exist, create one 
      if(!i){ 
       i = 1000; 
      } 

      var xmlhttp = new XMLHttpRequest(); 
      xmlhttp.open(method, url, true); 

      xmlhttp.onreadystatechange = function(){ 
       if (xmlhttp.status != 200) { 
        // Handle error, retry request 
        console.log("xmlhttp.status = " + xmlhttp.status + " and xmlhttp.readyState = " + xmlhttp.readyState); 
        setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i); 
        return; 
       } 
      }; 

      xmlhttp.send(null); 
     } 

基本上,如果有某種問題,我再次重試請求。如果服務器已啓動,有一點問題都沒有,但如果服務器關閉的JavaScript扔下我一個錯誤說:

PUT http://localhost:3000/buy/2/id=1329664820124 
executepopup.html:127 
(anonymous function) 

這是沒有太大意義,但卻。日誌中的狀態顯示爲「0」,這也非常糟糕。如果在此過程中再次打開服務器,它應該停止這樣做,但如果成功(我在服務器中看到一條日誌告訴我它已收到請求),它會一直調用execute方法。如果服務器打開,我不知道如何停止這種遞歸。難道我做錯了什麼?這個狀態是否等於零問題?

非常感謝

+0

您在哪裏運行此代碼?在內容中,還是在後臺頁面?什麼是完整的代碼?您是否已經將該域添加到'manifest.json'的'permissions'部分? – 2012-02-19 15:49:05

+0

是的,域被添加,否則它不能與服務器通信,對吧?此代碼在我的擴展的彈出頁面中運行。 – Masiar 2012-02-19 16:14:27

回答

4

解決問題

onreadystatechange被觸發每個狀態的變化,從狀態0到4,和許多倍之間。您應該只對readyState 4感興趣,因爲請求已完全在此時完成。
爲了讓你的方法工作,檢查是否xmlhttp.readyState == 4

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status != 200) { 


修復您的可怕實現的setTimeout

setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i);再次調用函數的正確方法。由於您正在開發Chrome擴展程序,因此您可以使用以下格式的setTimeout

setTimeout(execute, i, method, url, i*2); 
// Calls execute(method, url, i*2) after i milliseconds. 
+0

這似乎解決了這個問題。所以我所缺少的是對每一個狀態變化觸發'onreadystatechange'的知識。也感謝關於'setTimeout'的可愛解釋。 – Masiar 2012-02-19 16:52:29

+0

對不起,我剛剛意識到它仍然無法正常工作。看起來即使服務器在上線時收到了一些東西,這段代碼仍會繼續發送內容,例如,如果總是出現錯誤並且不斷調度'setTimeout'方法。這是因爲'status'始終是'!= 200'(如標題所示,總是爲零)。 – Masiar 2012-02-19 17:21:37

+0

@Masiar這不是JavaScript代碼中的錯誤,而是服務器端(或者理解它)。您可以通過在'if'塊中放置'console.log(xmlhttp.status);'來輕鬆進行調試。然後,觀察控制檯,並檢查記錄的狀態碼(等)。 – 2012-02-19 17:27:37