2010-06-07 40 views
1

我正在開發一個使用asp.net mvc的Web應用程序,並且需要在客戶端上執行秒錶(計時器)(預編程爲30秒,以在特定時間啓動)使用服務器的時間,順便說一句,客戶端的時鐘不能作爲服務器的時鐘。所以,我使用jQuery來調用由JSON服務器並獲取時間,但它是非常緊張,因爲每一秒我所說的服務器,以獲得時間,是這樣的:在客戶端啓動計數器的時間

$(function() { 
     GetTimeByServer(); 
    }); 

    function GetTimeByServer() { 
     $.getJSon('/Home/Time', null, function(result) { 
     if (result.SecondsPending < 30) { 
      // call another function to start an chronometer 
     } else { 
      window.SetTimeout(GetTimeByServer, 1000); //call again each 1 second! 
     } 
     }); 
    } 

它工作正常,但當我有超過3個或4個這樣的電話時,瀏覽器會慢慢運作!我想知道,在客戶端如何提高性能,或者是否有任何方法可以做到這一點...有沒有什麼辦法讓客戶端聽到像「套接字」那樣的服務器,以瞭解計時器是否應該啓動..

PS:Sorry for my english!

感謝 乾杯

+0

客戶端上的時間是否逐漸不同? JavaScript有一個Date對象,爲什麼不能在頁面加載和客戶端時間設置它? – 2010-06-07 13:05:00

+0

注意:這種方法會在您同時接入20個以上用戶(可能更快)時立即炸燬您的服務器 - 它不能很好地擴展;此外,傳輸延遲(的變化)將會消除任何時間精度的錯覺。 – Piskvor 2010-06-07 13:43:04

+0

Piskvor,你建議一些我可以做些什麼來提高性能? – 2010-06-07 13:49:28

回答

2

Felipe, 在頁面加載時獲取服務器時間和客戶端時間。並在引用中使用這兩個參數來確定每次不使用AJAX調用時服務器端的服務器時間。對不起suedo代碼過多,但它不應該太難。

var ServerTimeReference; 
var ClientTimeReference; 
function InitializeTime() 
    $.getJSon('/Home/Time', null, function (result) { 
     ServerTimeReference = result.ServerTime; //convert to js time 
     ClientTimeReference = new Date(); 
    }); 

function GetServerTime() { 
    var TimeDifference = //get the difference between server and Client time 
    var CurrentClientDateTime = new Date(); 
    var CurrentServerTime = // using timedifference and CurrentClientDateTime calculate ServerTime 
    return CurrentServerTime; 
} 
+0

嗨,約翰,感謝aswser。我忘了說......網站上的所有會話用戶的天文臺應該是平等的。這是我需要使用服務器時間的原因!如果我使用客戶端時間,用戶可能會影響改變窗口時鐘的腳本。你這樣說,是一種改進stopwacther的安全方法?或者你建議更多的味道? – 2010-06-07 13:31:21

+0

你可以使用類似上面的東西,並使用setInterval跟蹤服務器的時間。這樣,您在頁面加載時仍然只有一個呼叫到服務器,而不是很多。請注意,如果您擔心服務器的時鐘不同步,您可以選擇在5分鐘內發出ajax呼叫。這仍然會讓你無法頻繁地提出Ajax請求。 – 2010-06-07 14:00:18

2

我會做所有的時間在客戶端檢查。您已經在使用jQuery,只需使用一個定時器插件即可。我與this one取得了很好的成功。

1

如果你真的想用它這個樣子,你基本上得到了這個選項:

我不完全理解爲什麼你只是發送值客戶端,而不僅僅是一個「GO」字符串,如果客戶端應該開始做任何事情。無論哪種方式,你不必每秒都輪詢(我的意思是說,如果你的本地電腦的時鐘是錯誤的將是一個不好的跡象)。所以它應該足以每10秒「同步」一次(這也很快)。

所以我的基本策略是,調用一個後端函數,告訴我的客戶端剩下多少時間,並在該值上設置一個setTimeout

+0

嗨jAndy,感謝aswser。我忘了說......網站上的所有會話用戶的天文臺應該是平等的。這是我需要使用服務器時間的原因!如果我使用客戶端時間,用戶可能會影響改變窗口時鐘的腳本。使用您所說的Ajax輪詢,是一種改進stopwacther的安全方法?如果我的網頁上有很多項目,是不錯的選擇?或者你還建議了更多?謝謝 – 2010-06-07 13:32:32

相關問題