更改日期时调用函数一次

Call function once on day change

本文关键字:一次 函数 日期 调用      更新时间:2023-09-26

我有一个非常简单的问题,我似乎无法解决。我使用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中,如下所示:哈里斯->日期->日期:23

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

我还尝试过使用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();
                }
            })
        },

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

编辑:

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