为 parse.com 后台作业实施超过一天的重复间隔

Implement repeat interval of more than a day for parse.com background job

我创建了这样的后台作业:

Parse.Cloud.job("ResetLeaderboard",
    function(request, response)
    {
        Parse.Cloud.useMasterKey();

        var query = new Parse.Query("Leaderboard");

        query.find(
            {
                success: function(results)
                {
                    response.success("Success!");
                },

                error: function(error)
                {
                    response.error(error);
                }
            })
            .then(
                function(results)
                {
                    return Parse.Object.destroyAll(results);
                });
    });

我想 运行 每 15 天完成一次这项工作。但是 www.parse.com 没有选项可以设置超过一天的时间间隔。

我想我需要使用时间戳并将该值与当前时间进行比较。有人可以告诉我执行此操作的标准方法吗?

你是对的,作业调度 UI 被限制在一天内。解决问题的方法是让作业每天 运行,但在 15 运行 中的 14 秒什么也不做。那些无所事事的 运行 会很浪费,但从微观上看是这样,无论如何,解析正在支付账单。

解决方案的细节取决于具体要求。如果您需要最大程度的控制,例如精确到毫秒的 15 天,从特定于毫秒的时间开始,您需要在数据库中创建一些划痕 space,其中状态(特别是日期)来自先前的运行 被保留。

但是这个工作看起来像是一个清理任务,"very nearly 15 days, beginning within 15 days" 的要求就足够了。有了这个更简单的要求,您的直觉是正确的,简单的日期算法就可以工作。

另外,重要的是,在我看来你的意图是找到几个需要删除的对象,然后删除它们。发布的逻辑并不能完全做到这一点。我已经修复了逻辑错误并清理了 promise 处理...

// Schedule this to run daily using the web UI
Parse.Cloud.job("ResetLeaderboard", function(request, response) {
    if (dayOfYear() % 15 === 0) {
        var query = new Parse.Query("Leaderboard");
        query.find().then(function(results) {
            Parse.Cloud.useMasterKey();
            return Parse.Object.destroyAll(results);
        }).then(function() {
            response.success("Success!");
        }, function(error) {
            response.error(error);
        });
    } else {
        response.success("Successfully did nothing");
    }   
});

function dayOfYear() {
    var now = new Date();
    var start = new Date(now.getFullYear(), 0, 0);
    var diff = now - start;
    var oneDay = 1000 * 60 * 60 * 24;
    return Math.floor(diff / oneDay);
}

dayOfYear 功能感谢 Alex Turpin,here