2013-08-26 54 views
2

我正在一個函數中實現一個簡單的聊天實現,該函數有一個調用setTimeout來調用成功的ajax調用。這每30秒左右運行一次。這工作正常,但我希望在消息到來時立即收到通知。我看到了很多的例子與jQuery代碼長輪詢,看起來是這樣的:長時間投票:我如何冷靜下來?

function poll() 
{ 
    $.ajax(
    { 
     data:{"foo":"bar"}, 
     url:"webservice.do", 
     success:function(msg) 
     { 
      doSomething(msg); 
     }, 
     complete:poll 
    }); 
} 

我理解它是如何工作的,但這將只是不停重複發送立即請求到服務器。在我看來,需要在服務器上有一些邏輯,直到某些事情發生變化,否則即使沒有新的報告,也會立即發回響應。這是純粹在JavaScript處理還是我錯過了一些要實現的服務器端?如果在服務器上處理它,暫停服務器執行真的是個好主意嗎?在所有的經驗中,處理這個問題的更好方法是什麼?我的setTimeout()方法是否足夠,也許只有一個較小的超時?

我知道websocket,但由於它們還沒有得到廣泛的支持,我想堅持使用當前的技術。

+0

謝謝你們。我一直在尋找關於框架無關的一般概念的良好討論,並且你們都提供了一些很好的反饋。聽起來像這樣只是衡量增加的流量是否值得加快響應的問題。就我而言,它看起來像setTimeout是最好的折中。 – AceCorban

回答

1

做沒有任何停頓的服務器執行...這將導致曬出服務器資源,如果很多人試圖聊天......

使用客戶端,你與setTimeout做管理的暫停時間,但延遲較低

2

您錯過了long參與「長輪詢」。除非有什麼有趣的說法,否則服務器有義務不返回。有關更多討論,請參見this article

1

您已經確定了與Web服務器的權衡,開放連接,因此需要消耗http連接(即響應必須阻止服務器端)與頻繁使用「是否有任何新的」請求消耗帶寬有關。如果您的瀏覽器基礎可以支持它們(大多數'現代'瀏覽器http://caniuse.com/websockets

1

WebSockets可能是一個選項通過傳統的ajax輪詢在JavaScript方面沒有正確的方法來處理,因爲您總是會在一端或者其他如果你正在扼殺正在進行的請求的數量。看一下基於nodeJS的解決方案,或者查看基於PHP的Ajax Push Engine www.ape-project.org。

相關問題