每天更换一次呼叫功能

时间:2014-09-23 18:07:26

标签: javascript angularjs firebase

我有一个非常直截了当的问题,我似乎无法弄明白。我正在使用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()。我已将日期存储在Firebase中,如下所示: harrison -> date -> date: 23

我的假设是,每次在服务器上更新日期时,该函数都将基于Firebase的ref.on('child_changed')...方法运行。当我.set手动值时,该函数按预期运行,但不会在自动日更改时过夜。

我还尝试使用setIntervalsetTimeout每86400000毫秒(1天)运行一次该函数。但是,我不认为这些应用程序没有运行时会运行。

我必须在这里看到一些东西。感谢您的时间和帮助。

更新

只是澄清一下。

这就是我要做的事情:

我有两个复选框,用于标记需要由一组人(即用户)完成的任务。这两项任务只需每天一次由任何一个用户完成。在那一天结束之后,我想清除它们的值(将它们设置为假),以便同一个人或另一个人可以检查这两个框中的任何一个。

我没有运行服务器,我只使用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();
                }
            })
        },

1 个答案:

答案 0 :(得分:4)

您可以在firebase中存储lastUpdated字段。在客户端加载时,获取lastUpdated的值并将其与当前日期进行比较。如果不同,请运行Fed.newDay方法并更新lastUpdated日期。

编辑:

正如TheSharpieOne在评论中指出的那样,如果客户端已经在午夜时分登录,您将需要运行某种计时器功能以确保获得适当的行为。这使您可能会遇到潜在的竞争条件,如果当时有多个用户登录,则可能导致多次调用Fed.newDay。如果没有适当的服务器来正确管理状态,几乎不可能解决这些问题。