2010-09-17 50 views
0

我目前正在與AJAX搞混。現在,我創建了一個Markdown預覽器,用於更新textarea的更新。 (我想你知道這是從某個地方...... ;-))。現在如何在來自其他客戶端的事件時更新異步頁面?

,我想弄清楚,如何在事件從另一個客戶端發射更新頁面。所以說一個異步留言板。用戶寫東西,事件被調用,帖子被寫入。

但在其他客戶的頁面,新的職位是當然的尚未公佈,直到他們重新加載,並從數據庫中獲取帖子的更新列表。

現在,你怎麼能得到這個異步工作?那麼當客戶做某事的時候,其他客戶都會知道他做了什麼?

我不認爲這可以完全在AJAX中完成,但我也不知道如何在服務器端實現這一點,因爲它需要一個頁面重新加載通知其他客戶端的事件。

我正在考慮創建散列當前數據狀態的文件或數據庫條目。每當客戶端加載頁面時,他都會保存這個散列。然後,一個計時器(它存在於JavaScript中嗎?)每隔幾秒檢查一次哈希。

只要有人改變了數據庫,哈希值就會重新計算。如果腳本發現哈希已更改並與保存的哈希不同,則會從數據庫重新加載內容並保存新哈希。

這是即使工作?

回答

2

投票儘可能輕是真正的最佳解決方案。即使你使用套接字或其他東西......這基本上仍然是一個活躍的連接,可能需要進行輪詢(儘管以更有效的方式)。在10分鐘內即有像{「更新」:假}響應

20個查詢甚至不應該把一個凹痕在您的應用程序。我的意思是想象有人瀏覽您的網站要求20頁以及相關的圖像/腳本等(即使涉及一些緩存),可能很容易有數百個請求要求各種浪費的數據庫查詢信息顯示在頁面上實際上並不關心。

1

您可以使用輪詢。例如每個客戶端可能會傳送連續AJAX請求到服務器說,每次30秒鐘,看看新帖可用,如果是,告訴他們:

setInterval(function() { 
    // TODO: Send an AJAX request here to the server and fetch new posts. 
    // if new posts are available update the DOM 
}, 30 * 1000); 

在另一方面,當有人決定寫一個新的職位您向服務器發送AJAX(或不是AJAX)請求以將此帖存儲在數據庫中。

另一個不太常用的方法是CometHTML 5 WebSockets實現的概念,它允許服務器使用推送通知客戶端更改。

+0

第一種方法幾乎是我想到的,如果我理解正確的話?但是,這將每隔30秒查詢一次 - 如果沒有人發帖子,比如說10分鐘,我會做20個不必要的查詢... – 2010-09-17 12:05:10

+0

分鐘查詢。我認爲你不必擔心太多沒有價值的查詢。除非你每秒運行數千次查詢,否則你的服務器應該很容易處理它(取決於當然的服務器) – Alex 2010-09-17 13:07:09

+0

'如果沒有人發了一個帖子,比如10分鐘,我會做20個不必要的查詢 - 是的,這是正確的。 – 2010-09-17 13:34:59