2010-11-06 93 views
3

我試圖讓從服務器請求一個JSON對象,每次10秒內使用這個:如何每10秒發出一次Ajax請求(除了長輪詢)?

setInterval(function(){ 
    $.ajax({ 
    url: '/', 
    success: function(data){ 
     //do stuff with data 
    } 
    }); 
}, 10000); 

但是,這是不是很有效。我知道長時間投票,但我認爲這不會產生很大的影響。我知道我會每10秒接收一次新數據,那麼在效率方面不會長時間輪詢與setInterval完全相同嗎?

瀏覽器端緩存是否是解決此問題的良好解決方案?

的JSON對象我會得到這個樣子的:

var data = {1: {'user': 'John', 'age': '25'}, {2: {'user': 'Doe', 'age': '30'}} 

有了這個,我要顯示的數據[0]幾秒鐘。用戶,之後順利,改變成數據[1 ] .user通過使用'fadeOut'和'fadeIn'等等,直到它用完用戶。 我基本上想創建用戶用戶名的幻燈片。

緩存是一個很好的解決方案還是應該堅持每10秒做一次ajax調用?如果是這樣,那麼我將如何實現這一點,如果不是,我應該使用什麼方法?

我不知道如果我解釋得不夠好,所以告訴我,如果有什麼東西還不清楚。

回答

6

我肯定會考慮緩存重新連接每個推XHR。特別是如果你的用戶數量更多,每10秒發出一次AJAX請求可能會輕易超出你的服務器。但是,如果您想保持簡單,請每隔幾分鐘發出一次請求,以便更新。緩存用戶,讓他們生成JavaScript代碼,說users = new Array(user1,user2,...)。如果沒有那麼重要,你並不需要更新頁面,因爲大多數用戶都會在一兩分鐘內離開。如果你有一個長的列表,每隔幾秒就會改變一次,這給你足夠的時間不必使用AJAX進行更新,只依賴服務器生成的用戶列表。

如果不是,最後一次將列表更新到變量中,並在通過AJAX進行更新時將時間作爲參數發送到服務器,然後讓服務器快速檢查添加了哪些新用戶,併發送這些。然後,將新的服務器陣列與舊陣列合併。我強烈建議不要每10秒鐘給一個新名字打一個電話。您不僅會在服務器上運行更多帶寬,而且還會在列表中爲您找到下一位用戶時增加CPU使用率,然後發送給您。對於良好的實踐,始終讓客戶儘可能多地完成工作,而不會有滯後。只有一臺服務器,但有更多的客戶。您轉移到客戶端的每項操作都會爲您的服務器節省數百次(如果不是數千次)操作。

至於長輪詢vs setInterval,我會建議在這種情況下setInterval。您至少可以發送帶有時間參數的請求,指定最後一次更新時間,因此只需發送該小部分,而不是整個數據陣列。

var storage = new Array(user1, user2, ...); //set all your data here, generate it from your server 
var lastUpdate = //set the last time you updated it, just create a date variable 

function rotateUsers() 
{ 
    //do your fade in and fade out here 
} 

function update() 
{ 
    //create a new HttpRequest, and then set the url as "yoursite.com/update?lastUpdateTime="+lastUpdate; 
    //Take the response data, and merge the new users list with the old one 
} 
setInterval('rotateUsers()',10000); 
setInterval('update()',60000); //update once a minute 
0

長時間輪詢會比setInterval(fn,delay)更好,因爲至少在服務器準備就緒時,服務器只會向您發送更新的數據,而不是客戶端做出此假設,然後發出數據請求已改變。

如果你有過客戶機/服務器技術的控制,可以將數據推送到客戶端,而不需要使用WebSockets