2013-08-07 66 views
9

我接觸到了這些examples顯示投票與JavaScript中的長輪詢,但我不明白他們是如何彼此不同。特別是對於長輪詢的例子,它是如何保持連接開放的?民意調查與長時間輪詢

這是傳統的輪詢的情況是這樣的:

(function poll(){ 
    setTimeout(function(){ 
    $.ajax({ url: "server", success: function(data){ 
     //Update your dashboard gauge 
     salesGauge.setValue(data.value); 

     //Setup the next poll recursively 
     poll(); 
    }, dataType: "json"}); 
    }, 30000); 
})(); 

,這是長輪詢例如:

(function poll(){ 
    $.ajax({ url: "server", success: function(data){ 
    //Update your dashboard gauge 
    salesGauge.setValue(data.value); 

    }, dataType: "json", complete: poll, timeout: 30000 }); 
})(); 

謝謝!

回答

12

區別在於:長輪詢允許某種事件驅動的通知,所以服務器能夠主動向客戶端發送數據。正常輪詢是一個週期性的檢查數據取回,可以這麼說。維基百科對此非常詳細:

通過長輪詢,客戶端以類似於正常輪詢的方式向服務器請求信息;但是,如果服務器沒有任何可用於客戶端的信息,則服務器不會發送空的響應,而是保存該請求並等待信息變爲可用(或適合的超時事件),然後完成響應最後發送給客戶端。

長輪詢減少了需要發送的數據量,因爲服務器只在有真正的IS數據時發送數據,因此客戶端不需要在每個間隔x檢查。

如果您需要全雙工客戶端/服務器通信的更高性能(和imho更優雅)方式,請考慮使用WebSocket協議,這太棒了!

+1

客戶端能分辨長輪詢和慢響應的區別嗎?在我看來,投票和長時間投票基本上是一回事。輪詢:「客戶端:它是否準備好了?服務器:否」。長輪詢:「客戶端:它準備好了嗎?服務器:...否」。 – DavidS

+0

@Davids:以下是區別:通過輪詢,客戶端會詢問並立即回答「是/或」。通過長時間的投票,客戶詢問但*不會立即得到答案。服務器不會對問題做出迴應,直到有*可以回答的東西。所以這個問題一直在等待着。 – Robert

+0

@Robert如果發生超時事件並且服務器無法在長輪詢中發送數據,會發生什麼情況?客戶是否應該再次發送相同的請求? –

2

輪詢基本上是定期檢查服務器在客戶端提出請求後的信息。如果所需的信息可用,它將以響應的形式發送給客戶端,否則服務器將發送一個空的響應。輪詢是通過函數的幫助完成的,如setInterval()和setTimeout()

長輪詢的情況下,客戶端向服務器發出請求,如果響應可用,服務器的信息,否則響應,直到所需的信息不存在,它保持請求與傳統的輪詢不同,服務器會以空響應進行響應。