2013-12-18 61 views
3

我創建一個web應用程序,允許用戶管理日曆(CRUD事件,任務提醒等)的Javascript定時通知 - 的setTimeout,setInterval的

,我試圖在那裏他們將實現一個功能在事件/任務前x分鐘收到彈出式提醒。從我的理解真的只有一種方法來做到這一點與JavaScript:

在登錄時,檢查數據庫中的任何即將發生的事件(說在未來12小時),並創建一個setTimeout爲下一個事件,當那setTimeout執行,再次檢查下一個事件,等等......

我的問題是,將有多個setTimeouts(10+)在用戶交互過程中在後臺運行減慢我的應用程序的性能?

有沒有更好的方法來處理客戶端的彈出通知?推送通知?任何建議將不勝感激!

+0

爲什麼你會有10+在後臺運行?如你所說,爲下一個事件設置一個超時時間。發生火災時,檢查下一個事件並設置新的計時器。 – crad

+0

這是一個非常複雜的應用程序,我使用定時notifcations的很多事情。事件提醒是迄今爲止最重要的壽...我真的沒有看到自己有超過10我只是用它作爲上限 –

+1

好吧,也許你的意思是設置多個事件一次超時,這將是不必要的。聽起來很合理。 – crad

回答

3

我的問題是,將有多個setTimeouts(10+)在用戶交互過程中在後臺運行減慢我的應用程序的性能?

在這些數字中,沒有。 (根據如何+10++的。我的意思是,我想到一百萬可能會是一個問題。)

另一種方法就是讓你使用一個計時器(比如每分鐘),以檢查對於那時應該發生的通知。例如:

function notifyForThisMinute() { 
    // Notify user of things we should notify them of as of this minute 
    // ... 

    // Schedule next check for beginning of next minute; always wait 
    // until we're a second into the minute to make the checks easier 
    setTimeout(notifyForThisMinute, (61 - new Date().getSeconds()) * 1000); 
} 
notifyForThisMinute(); // First call starts process 
+0

是的,我也想到了這種方法,但是如果當天沒有事件,會不會對服務器進行大量不必要的調用?......而且我真的不能看到我會超過10個的情況,那就是prolly我的上限 –

+0

@AO:我沒有說這是一個服務器調用。 :-)您可以加載下一個X分鐘的信息並將其放在本地。 –

+0

好點....性能明智這將是相同的壽不會呢?一個長時間運行的setTimeout與一堆連續的較短的一個? –

4

這取決於瀏覽器(或更具體地說,它的JavaScript引擎),顯然甚至OS。

Neil Thomas (while working on GMAIL mobile)John Resig已經分析了定時器。

需要注意的一點是計時器每隔給定的時間間隔運行一次(比如說每200毫秒或每10分鐘一次)。

托馬斯:

低頻計時器 - 一個秒以上的延遲計時器 - 我們可以創建一個沒有在任[在Android G1或iPhone 3G]顯著降低性能多的定時器。即使安排了100個定時器,我們的應用程序響應也不明顯。但是,對於高頻計時器,故事恰恰相反。每隔100-200毫秒發射一次定時器足以讓我們的用戶界面感覺呆滯。

托馬斯:

請記住,這段代碼是要執行很多次每秒。遍歷一系列已註冊的回調函數可能會稍微「乾淨」一些,但這個函數儘可能快地執行至關重要。對函數調用進行硬編碼也使得跟蹤定時器內正在完成的所有工作變得非常容易。

Resig的:

一旦你開始移動到的64-128同時定時器的範圍內,你幾乎不走運的在大多數瀏覽器。

我們也可以看看Chronos

+1

我只想補充一點,這裏引用的這兩篇文章都很陳舊(例如,John的年齡是7歲),並且計時器在所有瀏覽器中都有所改進,因此此答案中的信息不完全正確。 – YemSalat

相關問題