2012-05-05 50 views
0

Comet programming幾乎爲任何Web開發人員所知,而jQuery是目前市場上最流行的JavaScript庫。對?如何在jQuery中掛鉤到服務器更新(comet ajax)?

現在,假設服務器上有一項服務器每秒向客戶端推送數據。基於C#語言的服務器代碼的ASP.NET實現可能是這樣的:

while (true) 
{ 
    Response.Write("{data: 'data from server'}"); 
    Response.Flush(); 
    Thread.Sleep(1000); 
} 

也可以設想頁面加載到瀏覽器後,一個jQuery片段觸發與服務器保持活動狀態的HTTP連接阿賈克斯,上哪個服務器將這些數據片段發送回客戶端。

到目前爲止,這並不是一個問題,因爲小孩開發者也可以這樣做。但是,jQuery AJAX具有許多回調函數,可以在不同場合觸發。 success,error,complete等。但是這些方法都不會在從服務器發送的每個JSON上觸發。我的意思是,這個代碼不工作:

$(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'url-of-that-service', 
     dataType: 'json', 
     success: function (result) { 
      /* 
      Here, I need to get the result sent by 
      the Server, and based on its data, 
      manipulate DOM. For example, imagine 
      that server sends its current time 
      in JSON format each second. I need 
      to parse the sent JSON string, and 
      append the server time somewhere in 
      the web page. 
      Success function never gets fired for 
      these server-pushed data. 
      What should I do? 
      */ 
     }, 
     error: function (error) { } 
    }); 
}); 

一種方法jQuery中收到通知最新信息是輪詢底層xhr對象的responseText,並定期檢查它的服務器發送的最新數據。但是,我正在尋找一種基於事件的方法來掛鉤活動的ajax連接,並在服務器發送任何東西時收到通知。

我的問題是,我應該如何檢測到服務器上有東西?有沒有包括setTimeoutsetInterval? jQuery有什麼可以幫助我們嗎?

回答

0

您有發送ajax請求的功能,例如sendCometRequest。您可以使用遞歸而不是setInterval成功回調,您在繼續從服務器響應後再次調用sendCometRequest。它稱爲長輪詢方法。對於C#,您可以閱讀this article。它解釋了異步彗星服務器的一個好方法。

+0

我需要將它作爲* * pushlet *(http://en.wikipedia.org/wiki/Push_technology#Pushlet)實現,而不是作爲* long-polled *連續的請求。 –

0

那麼很多事情不是你的問題清楚..

但是,如果你正在尋找彗星......我想你應該尋找一個堅實的和實際執行的彗星,並避免做[Thread.sleep代碼()+連續輪詢]類型的黑客攻擊,因爲它不適合許多同時使用的用戶。

對你有.NET - lightstreamer - http://www.lightstreamer.com/

而且,請確保你真正需要的彗星,否則請嘗試使用網絡套接字。

+0

感謝您的回答。我已經熟悉彗星編程的現成解決方案。但是,這一次我需要從頭開始實施它。 ** Web-Sockets **或** Server-Sent Events **可能是很好的選擇。但是我沒有足夠的時間來學習它們並解決未知的問題和挑戰。 –

+0

網絡套接字相當容易使用 –