2009-11-16 91 views
3

我需要保持某些數據(在一個網格中)最新的 ,並且要每隔15個seponds對服務器進行一次輪詢,以獲取數據並刷新網格,但它感覺有點髒(網格將每15秒有一個加載圖標..)看起來不太好...
另一種方法是檢查是否有新數據並將新數據與當前數據進行比較,並只刷新網格如果有任何更改(我會做這個客戶端壽,因爲維修器材的每一個登錄用戶的當前狀態也似乎是一種矯枉過正)
我敢肯定有更好的解決方案,並希望能聽到他們
Ajax數據更新。 Extjs

我聽說過彗星,而是針鋒相對似乎有點矯枉過正
BTW即時通訊在服務器端使用asp.net MVC的

我很想聽聽人們不得不說贊成或反對投票連續的與js 乾杯

+0

你好:謝謝。這是一個彗星的實現,因爲我在這個問題上說這是有點過度的 – roundcrisis 2009-11-24 15:38:08

回答

2

聽起來像COMET確實是你正在尋找的解決方案。在這種情況下,您不需要輪詢,也不需要進行比較,因爲您只能將「相關」更改的數據推送到您的網格。

退房WebSync,這是一個不錯的彗星服務器,可以讓你完成你所描述的任務。

這是一個demo using ExtJS and ASP.NET,推動股票行情更新的連續流。演示比你需要的多一點,但校長是相同的。

1

每當你從服務器得到答案,檢查是否有什麼改變。

請求。不要讓用戶知道你正在使用某個微調器,不要隱藏它。在15秒內安排下一個請求。下一個請求執行;如果沒有更改,請在15 + 5秒內安排下一個。下一個請求執行;如果沒有任何變化,請在15 +5 +5秒內安排下一個。等等。下一個請求執行;如果確實發生了變化,請將間隔重置爲15秒。

Prototype可以通過Ajax.PeriodicalUpdater半自動執行此操作,但您可能需要更多根據需要自定義的內容。

無論如何,只是一個想法。


至於連續輪詢一般;只有當你訪問不同的站點時(使用PHP「橋」或類似的東西)纔是不好的。如果你使用自己的資源,你必須確保你不會耗盡它們。用衰敗來設置體面的時間間隔。

+0

感謝您的答案 對於我試圖建立的應用程序類型,updaets需要是恆定的,它們不能衰減 – roundcrisis 2009-11-16 16:32:20

0

我認爲檢查是否有新數據是一個不錯的選擇。

我會統計數據庫中的行數並將其與您的(HTML)表中的行數進行比較。如果它們不一樣,請獲得行中的差異。

假設您有12個錶行,並且您檢查時有14個數據庫行:獲取最新(14 - 12)= 2行。

1

我建議如果「更新需要恆定」,Comet不是一個矯枉過正的行爲。 15秒是非常頻繁;你是否被許多人訪問過?您的服務器可能會在服務於這些請求的同時捱餓其他人。

+0

是在這個種類的情況,我認爲,該死的必須有一個很好的負載測試工具.. – roundcrisis 2009-11-18 16:22:47

+0

如何http://seleniumhq.org/或http://www.badboy.com.au/ 我用BadBoy加載測試(前一段時間),我喜歡它。 – Upperstage 2009-11-18 16:41:58

+0

我試過硒,但它確實似乎不能很好地擴展,也許我沒有做正確的?也就是說,我可以同時測試幾個瀏覽器的自動化,但這就是它。 – roundcrisis 2009-11-19 19:16:16

1

我不知道你的服務器端數據源是什麼樣的,或者你正在提供什麼樣的數據,但一種解決方案是用時間戳服務你的數據,併發送最後一次輪詢的時間戳每一個後續請求。

  1. 輪詢服務器,發送最後一次輪詢服務的時間戳(例如:lastPollTime)。
  2. 服務器使用時間戳確定哪些數據是新的/更新的,並僅返回該數據(delta),從而減少傳輸大小並簡化客戶端代碼。
  3. 它可能是空的,它可能是幾個單元格,它可能是整個網格,但客戶端總是更新返回給它的數據,因爲它已知是新的。

這種方法的好處是它簡化了客戶端代碼(這是客戶端加載的代碼更少),並減少了用戶後續沒有新數據的輪詢的傳輸大小。

此外,這允許您維護服務器端的狀態,因爲您不必爲每個單獨的用戶保存狀態。你只有一個狀態,即當前數據的狀態,這是由訪問時間區分的。