2013-03-25 81 views
2

我想使用ajax編寫聊天應用程序。所以我需要每100毫秒(0.1秒)檢查一次數據庫中的用戶消息表。是否有任何問題,如果我使用setTimeOut每100毫秒調用ajax?任何性能問題?任何陷阱或任何東西?使用setTimeOut進行Ajax調用

+0

沒有任何問題,但只是確保你的ajax和後端能夠發送迴應內或小於90milisecond ... – 2013-03-25 06:40:08

+0

我怎麼可以確保這一點? – 2013-03-25 06:42:45

+0

使用firebug firefox add就可以顯示響應時間和內容......也可以使用yslow firefox addon查看哪個響應延遲... – 2013-03-25 06:43:55

回答

0

這是一個非常糟糕的主意。雖然它可能適用於本地計算機和少數用戶,但無法輕鬆擴展到更多用戶。我建議你看看websockets和長時間的投票。

+2

你建議長輪詢,所以你可以建議任何例子..?按照我所知,長時間輪詢可以使用setTimeout來實現......對。 – 2013-03-25 06:44:49

+1

@DipeshParmar長輪詢和常規輪詢之間的區別在於,您可以防止您的請求超時,並且服務器在需要時進行響應。您只在前一個過期或完成時發出新請求。您不一定會使用setTimeout,因爲當您發送下一個請求時,取決於服務器響應的時間。 – 2013-03-25 06:46:11

+1

@DipeshParmar發送多個請求只是在短時間間隔內頻繁發生多個請求,而不是長時間輪詢。長輪詢本質上意味着服務器不會寫任何響應,並且在請求有任何數據寫入之前(或者直到請求超時,這可能比幾秒鐘更長的時間)。只有當前請求過期或當前請求獲得數據響應時,客戶端纔會發出新請求。 – Munim 2013-03-25 06:51:37

0

更好的選擇是使用Socket.IO。它使這項任務輕鬆了許多

Socket.IO使得跨瀏覽器解決方案

socket.io

服務器例如:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

客戶端(瀏覽器):

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

編輯:

對於PHP,phpwebsocket類將是一個不錯的選擇以及客戶端jquery plugin

+1

這是一個很好的建議,我自己是node.js開發人員,但問題是標記爲asp.net和php。是否asp。網有什麼類似websocket的解決方案? – Munim 2013-03-25 06:48:15

+0

@Munim IIS7不支持它,但IIS8會。我相信PHP中的網絡套接字目前是可能的。 – 2013-03-25 06:50:11

+0

我是asp.net開發人員。我如何在asp.net中使用這個? – 2013-03-25 06:52:33

0

的JavaScript知道兩類定時器:的setInterval和setTimeout的。 setInterval每隔100毫秒觸發一次,setTimeOut在前一次觸發100毫秒後調用下一個。在調整應用程序時,應該牢記這一行爲。你也可以考慮網絡工作者,他們真的在單獨的線程上工作。他們溝通以消息爲基礎,這聽起來是適合您問題的解決方案。確切的延遲(100毫秒或更長)是您真正需要嘗試的。 John Resig的書顯示,從21ms(IE9)到1ms(Opera),各種瀏覽器的實時定時器延時差異很大。