2014-09-03 76 views
1

我有一個客戶端服務器應用程序。服務器端完全在java中。客戶端有幾行html,其餘部分以純javascript(我不使用ajax或jquery等)。XmlHttpRequest不報告服務器端進度

客戶端通過輸入框接收用戶輸入,當用戶單擊按鈕時,客戶端使用XmlHtpRequest向服務器發送POST請求。然後服務器運行一個可能需要幾分鐘的過程。服務器週期性地(每5秒)發送一個帶有HTTP狀態代碼202並且內容爲「處理...完成5/100」的進度更新消息。數字5和100是一個樣本。它不是100,而是實際的最終計數器,而不是5,它是指示進度的當前計數器。當服務器完成處理後,它發送一個200 OK,並以最終輸出作爲內容。我有一個輸出文本區域,我希望在處理期間顯示進度消息,稍後最終輸出也會放在同一個輸出文本區域中。

我的客戶端的JavaScript代碼是:

<script> 
var xhr = new XmlHttpRequest(); 
function sendCommandToServer() { 
    window.xhr.onreadystatechange = getServerResponse; 
    window.xhr.open("POST", (document.domain + "/" + "executeCommand"), true); 
    window.xhr.send("arguments and data for the command"); 
} 
</script> 

<script> 
function getServerResponse() { 
    if(window.xhr.status === 202) { 
     myTextArea.value = window.xhr.responseText; 
     window.xhr.onreadystatechange = getServerResponse; 
     return; 
    } 
    if(window.xhr.status === 200) { 
     myTextArea.value = window.xhr.responseText; 
     return; 
    } 
    alert("processing error"); 
} 
</script> 

服務器正確地獲取命令,並運行所述過程和完成和產生輸出。它也正確地發送進度消息。但我的客戶端JavaScript並沒有得到所有這些。我能夠從服務器獲得第一個進度消息 - 例如 - 「Processing .... 5/100」 - 但之後,我無法獲得進一步的調用getServerResponse()以繼續更新進度服務器發送消息。如果我修改服務器端以避免發送進度並僅發送最終輸出結果,它將正常工作,並且我會在客戶端顯示最終的輸出結果。我在IE10和Chrome上運行這個,具有相同的行爲。這個用例可以使用xmlHttpRequest()嗎?難道我做錯了什麼?任何幫助將不勝感激。謝謝。

回答

0

我對此很陌生,試圖找出一種實現類似的方法。 我認爲202狀態碼是唯一可以得到的響應,也就是說,服務器在接受作業(202)時會發送一個響應,或者在完成時發送200響應。

來源: http://100pulse.com/http-statuscode/202.jsp

+0

Morvael - 我剛纔看到這個反應形成你,所以我想我會添加什麼,我終於做到了。在嘗試爲命令和進度獲取相同的xmlHttpRequest()後掙扎(失敗)後,我創建了2個單獨的XmlHttpRequests()。第一個人發佈命令並等待最終響應,而第二個人定期輪詢服務器的進度。 – user3925450 2014-11-14 11:21:15