2012-12-25 53 views
4

我正在嘗試創建一個實時網站分析儀表板,它使用jQuery/JavaScript異步創建一個到服務器的開放HTTP連接,以輪詢服務器以更新數據它們發生。使用JavaScript和jQuery進行簡單的長查詢

其明顯的啓動將使用XMLHttpRequest對象或jQuery的$.ajax方法來發送一個GETPOST請求到服務器異步請求的一些數據。

但是,除了一次使用setInterval方法每次發送一個請求,每個30 seconds我不確定如何使服務器的連接持久化。基本上,我只想發送一個http請求,並確保與服務器的連接保持打開以進行輪詢!

我的例子與setInterval代碼如下:

<div id="analytics"></div> 
<script> 
var analytics = document.getElementById('analytics'); 
setInterval(function(){ 
    $.ajax({ url: "http://server.com/", success: function(data){ 
     analytics.innerHTML = data; 
    }, dataType: "json"}); 
}, 30000); 
</script> 
+1

是否有任何理由需要發送一個http請求?如果你想要一個持久連接,你可能想查看websockets。 – kennypu

+0

http不能這樣工作 – charlietfl

+0

我想我需要持久性的兩個原因:(1)它可以確保我的更新更實時;(2)我認爲它有更好的性能,即減少多個請求對服務器的衝擊。作爲charlietfl說@ – technojas

回答

12

網上搜索後,這是我一直在尋找這不使用sockets.io也不WebSockets的答案,但並通過採取使用jQuery它的complete方法的優點是創建一個人工循環:

<div id="analytics"></div> 
<script> 
var analytics = document.getElementById('analytics'); 
(function poll(){ 
    $.ajax({ url: "server", success: function(data){ 
     analytics.innerHTML = data; 
    }, dataType: "json", complete: poll, timeout: 30000 }); 
})(); 
</script> 

Sourc e是來自Technoctave的Tian Davis:http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

+2

通過上面編寫的代碼,我認爲如果發生超時,您會發現輪詢週期將永久失敗。你可能不希望這樣,所以你需要採取措施確保它繼續下去,例如。採用某種自定義超時機制而不是內置的'timeout:30000'方法。 –

+4

另外,只要收到每個HTTP響應,都會立即調用'poll' - 不會延遲 - 所以代碼當然不符合您的非抖動要求。 –

+2

@ Beetroot-Beetroot即使在超時(錯誤)後仍會發生完整的調用,您必須在此考慮成功。 – Renaud