2014-09-23 60 views
1

我有一個非常直接的問題,我似乎無法弄清楚。我使用AngularJS和Firebase作爲後端。每天更換一次通話功能

基本上,我有一個函數,我想運行一次,每天,在午夜爲了做一個值重置(設置一些對象屬性爲false等)。該功能工作正常,當我手動運行並按照預期工作。

但是,我似乎無法讓它在日更改中自動運行。

我想在午夜運行的功能,每天一次是Fed.newDay()。它通過Fed工廠注入到我的Dte工廠 - 這使爲期一週的天更新的對象,月等

目前,我Dte廠,我有以下對象:

var date = new Date();  

var Dte = { 

      currentDate: function() { 
       ref.update({date: date.getDate()}); 

       ref.on('child_changed', function(snapshot) { 
        console.log('Dte registered new Day'); 
        Fed.newDay(); 
       }); 

       return date.getDate(); 
      }, 
} 

的這裏的目標是在每次更改日期時運行一次Fed.newDay()。我已經存儲在火力地堡的日期如下: harrison -> date -> date: 23

我的假設是,每一個日期是在服務器上更新時間,該功能將運行基於火力地堡的ref.on('child_changed')...方法。當我手動設置該值時,該功能按預期運行,但不會在自動更改日期過夜。

我也試過使用setIntervalsetTimeout每86400000毫秒(1天)運行一次函數。不過,我不認爲這些應用程序在運行時運行。

我必須在這裏忽略一些東西。感謝您的時間和幫助。

更新:

只是爲了澄清。

這就是我想要做的事:

我有兩個複選框,標誌着需要由一羣人,用戶可以完成的任務的完成。這兩項任務只需要由任何一個用戶完成一次,每天一次。在那一天結束後,我想清除它們的值(將它們設置爲false),以便同一個人或另一個人可以檢查兩個框中的任一個。

我沒有運行服務器,我只使用Firebase。 Firebase具有我可以訪問的價值,只要當天有人使用該應用程序,該值目前正在更新當月的某天。

解決方案:

感謝@bmceldowney的幫助。

這是我到達的解決方案。此外,請參閱下面的正確答案,以避免多個用戶在11:59登錄時可能出現的問題。

var Dte = { 

     currentDate: function() { 
      dateRef.update({date: date.getDate()}); 
      return date.getDate(); 
     }, 

     setLastUpdated: function(day) { 
      dateRef.set({lastUpdated: day}); 
     }, 

     compareReset: function(last) { 
      var current = Dte.currentDate(); 
      if (last !== current) { 
       Fed.newDay(); 
       Dte.setLastUpdated(current); 
      } else { 
       console.log('no reset needed'); 
      } 
     }, 

     load: function() { 
      dateRef.on('value', function(snapshot) { 
       if (snapshot.val() != null) { 
        var data = snapshot.val(); 
        var updateValue = data['lastUpdated']; 
        Dte.compareReset(updateValue); 
       } else { 
        Dte.load(); 
       } 
      }) 
     }, 
+0

你想要午夜本地用戶時間,還是午夜格林尼治標準時間? – TheSharpieOne 2014-09-23 18:09:06

+0

午夜本地用戶時間,GMT-6,CST。 – Himmel 2014-09-23 18:11:52

+0

你說'setInterval'不是一個選項,因爲當應用程序沒有運行時它們不會運行。這對於在客戶端上運行的任何解決方案都是一個問題。 – bmceldowney 2014-09-23 18:13:56

回答

4

您可以將lastUpdated字段存儲在firebase中。在客戶端加載時,獲取lastUpdated的值並將其與當前日期進行比較。如果不同,請運行Fed.newDay方法並更新lastUpdated日期。

編輯:

由於TheSharpieOne在評論中指出的那樣,你會需要某種運行,以確保您得到適當的行爲,如果一個客戶在午夜鐘聲敲響的已經登錄定時器功能。這會讓您打開潛在的競爭條件,如果多個用戶當時登錄,可能會導致Fed.newDay被多次調用。如果沒有適當的管理狀態的適當服務器,這些問題幾乎無法解決。

+0

這聽起來像是解決方案。謝謝。我將嘗試並實施它,然後我會跟進。 – Himmel 2014-09-23 19:21:09