我有一个非常直截了当的问题,我似乎无法弄明白。我正在使用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
手动值时,该函数按预期运行,但不会在自动日更改时过夜。
我还尝试使用setInterval
和setTimeout
每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();
}
})
},
答案 0 :(得分:4)
您可以在firebase中存储lastUpdated
字段。在客户端加载时,获取lastUpdated
的值并将其与当前日期进行比较。如果不同,请运行Fed.newDay
方法并更新lastUpdated
日期。
编辑:
正如TheSharpieOne在评论中指出的那样,如果客户端已经在午夜时分登录,您将需要运行某种计时器功能以确保获得适当的行为。这使您可能会遇到潜在的竞争条件,如果当时有多个用户登录,则可能导致多次调用Fed.newDay
。如果没有适当的服务器来正确管理状态,几乎不可能解决这些问题。