2014-02-14 55 views
3

我想要一個簡單的長投票系統(是的,我做不是想要使用任何現成的scipt,因爲我想從中學習)。我正在使用一個節點服務器,我可以輕鬆地將數據傳回/寫入客戶端,而無需致電result.end();。我應該如何做這個客戶端?我只是希望這是一個簡單而不是很好的回退,因爲用戶使用ie < = 9,因爲更好的瀏覽器可以快速且易於使用websocket。簡單的XHR長輪詢沒有jQuery

長問題簡短:如何在沒有jQuery或其他框架的純JS中進行長輪詢? (或者是否有比長輪詢更好的方法)。

回答

1

以下是你在找什麼?

var xhr = new XMLHttpRequest(); 
    xhr.responseType = 'blob';//or 'text', 'json', ect. there are other types. 
    xhr.timeout = 60000;//milliseconds until timeout fires. (1 minute) 
    xhr.onload = function(e2){ 
    var blob = xhr.response; 
    //handle response data 
    } 
    xhr.ontimeout = function(){ 
    //if you get this you probably should try to make the connection again. 
    //the browser should've killed the connection. 
    } 
    xhr.open('GET', "/path/to/URL.cmd?param1=val1&param2=val2", true); 
    xhr.send(); 

我覺得timeout屬性的關鍵是使長期調查工作,更多的看到spec有對的responseType的同一個文檔中的更多信息。如果未指定超時,則默認值爲零。

+0

因此,這是爲我已經閱讀的響應,但我想知道我應該如何通過xhr發送數據,當我的應用程序準備好數據時,比如多次調用xhr.send(data)或者這是不可能的? (所以我需要在每次有數據或排隊數據時將它打開一個新的xhr,發送它x秒)。所以就像在節點上,我可以打電話多次,然後打電話.end – MarijnS95

+0

也許,我一直在給它一些想法。 我從來沒有玩過這個,但有一個部分狀態'(xhr.readyState == 3)'我對瀏覽器的執行情況瞭解不多。那就是說有一個[arrayBuffer叫做響應主體](http://www.w3.org/TR/2014/WD-XMLHttpRequest-20140130/#re​​sponse-entity-body),它可能包含部分數據,直到readyState狀態已經完成了。 因此,您可以多次執行來自服務器的.write調用,並將其讀取並在部分段中處理。你可以增加超時毫秒,回憶同樣的請求'ontimeout' –

+0

這就是我們已經可以做到的,當XHR打開時(當兩端都沒有關閉/結束時),我可以調用多次* *服務器**,但我的問題是,我應該如何從**客戶端**做這樣的事情。 – MarijnS95