在Node.js中使用计时器而不是已调度的Cron作业调度任务

在Node.js中使用计时器而不是已调度的Cron作业调度任务,node.js,timer,cron,Node.js,Timer,Cron,这是我的目标: 上次文档更新5分钟后,我想执行一次性任务 这就是行动的流程: 用户更新文档-计时器启动并从5分钟开始倒计时 如果用户再次更新同一文档,并且前一个计时器(由文档标识)仍在运行,请将该计时器重置为5分钟,然后重复倒计时 计时器已过时-执行一次任务 我以前从未做过这样的事情,我不知从何说起 我可以使用Mongoose中可用的方法轻松地挂接文档更改(即保存时,do func设置或重置计时器) 但是,我不知道如何: 创建一个等待5分钟的计时器,然后执行一项任务 使计时器可访问,以便我可以

这是我的目标:

上次文档更新5分钟后,我想执行一次性任务

这就是行动的流程:

  • 用户更新文档-计时器启动并从5分钟开始倒计时
  • 如果用户再次更新同一文档,并且前一个计时器(由文档标识)仍在运行,请将该计时器重置为5分钟,然后重复倒计时
  • 计时器已过时-执行一次任务
  • 我以前从未做过这样的事情,我不知从何说起

    我可以使用Mongoose中可用的方法轻松地挂接文档更改(即保存时,do func设置或重置计时器)

    但是,我不知道如何:

    • 创建一个等待5分钟的计时器,然后执行一项任务
    • 使计时器可访问,以便我可以重置计时器
    • 使计时器可访问,以便我可以添加额外的变量,这些变量将在计时器已过时在函数中使用
    我调查过Cron作业,但它们似乎每天都在同一时间安排任务

    我需要一个可以延迟任务的计时器,还需要能够重置该计时器,并向计时器添加额外数据


    非常感谢您的任何提示。

    您可以使用事件进行提示。使用某些参数调用事件,然后在任务之前添加睡眠并执行任务。但是在nodejs中添加sleep或settimeout不是一个好主意。

    这是我设法完成的解决方案

    首先,值得注意的是,我最初的假设是正确的:

    Cron作业非常适合于每天在同一时间安排的重复性任务。但是,对于动态创建并具有倒计时元素的任务,cron作业不是合适的工具

    但是,请输入节点计划()

    Node Schedule是Node.js的一个灵活的类cron而非类cron的作业调度器。它允许您计划作业(任意函数)在特定日期执行,并具有可选的重复规则它在任何给定时间只使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业)

    计时器的使用正是这些实时任务所需要的

    因此,我的解决方案如下所示:

    var schedule = require('node-schedule'),
    email_scheduler = {};
    
    email_scheduler["H1e5nE2GW"] = schedule.scheduleJob(Date.now() + 10000, function(){
      console.log('its been a total of 10 seconds since initalization / reset.');
    });
    
    var second_attempt = schedule.scheduleJob(Date.now() + 5000, function(){
      console.log("5 seconds elapsed from start, time to reset original scheduled job");
    
      email_scheduler["H1e5nE2GW"].cancel();
    
      email_scheduler["H1e5nE2GW"] = schedule.scheduleJob(Date.now() + 10000, function(){
        console.log('its been a total of 10 since last one seconds.');
      });
    
      schedule.scheduleJob(Date.now() + 5000, function(){
        console.log("it's been another 5 seconds since reset");
    
      });
    });
    
    我的想法(尽管尚未测试)是,我可以通过创建节点模块为email_调度器对象创建一个类似单例的实例。例如:

    // node_modules/email-scheduler/index.js
    
    module.exports = {};
    

    这样,我就可以访问scheduleJobs并重置节点应用程序的每个文件中的计时器

    我也遇到了同样的难题,但最终还是选择了javascript本机函数

    function intervalFunc() {
      //inside this function you can request to get the date and time then decide what to do and how to do it
      autogens.serverAutoGenerate();//my function to autogenerate bills
    }
    
    setInterval(intervalFunc, 1000);//repeat task after one seconds
    

    在node js应用程序的索引文件或条目文件中添加代码将使函数重复执行。您可以根据需要选择更改频率。如果您想一天运行三次cronjob,请获取24小时内的秒数,然后除以3。如果您想在特定的时间运行作业,可以使用
    新日期()
    ,检查是否是执行事件的正确时间。

    如果我将调度程序存储在mongodb而不是内存中,是否会有不同。我想调度程序本身必须存储在内存中。但是每个调度程序操作中使用的数据可以存储在MongoDB中,并加载到调度程序函数中。我不知道如何做到这一点。。你能再详细解释一下吗?你为什么不喜欢这个例子?为什么要从mongodb加载?实际上,我希望在服务器重新启动时保持计划,因此mongodb