2014-09-23 149 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