当前位置: 代码迷 >> JavaScript >> 流星:使用setInterval()每天运行一次函数
  详细解决方案

流星:使用setInterval()每天运行一次函数

热度:111   发布时间:2023-06-13 12:38:03.0

我正在尝试运行一个功能,该功能将搜索某些参数,并且每天仅向用户发送一次电子邮件。

我发现可以完成许多方法。 似乎setInterval()可以做到这一点。

 setInterval(function () {
    var date = new Date();
    if (date.getDate() === 12 && date.getHours() === 10 && date.getMinutes === 0) {
        alert("Surprise!!")
    }
}, 1000)

例如,以上内容每天都会在上午10点触发。

我还发现有一个运行cron作业的软件包。

看来我可以设定一项日常工作来每天发送电子邮件。 我从未使用过cron作业,因此我认为此刻对我而言这将更加困难。

最后,我也找到了这样做的方法:

仅具有常规功能。

似乎setTimeout()是完成它的最简单方法。 但是有什么挫折吗? 我不想错过电子邮件,或者不想多次错过电子邮件用户。 我的网站正在运行并且还在不断发展,所以我不愿发现困难的方法。

任何帮助表示赞赏。

我认为您必须使用Meteor.setInterval()而不是setInterval()才能使其在服务器上正常工作。 但是,我用这个功能我需要运行每秒 ; 在更长的时间内,任何类型的cron作业包也可以正常工作,例如synced-cron

因此,完成本主题并可能在相同情况下帮助任何人。 这就是我做的。 我添加了软件包“ percolate:synced-cron”。 然后在服务器端,我创建了一个文件“ cron.js”。 这是我使用的代码。 为了隐私起见,我删除了功能的其余部分,但是重要的部分在这里。 parser.text使得选择时间变得非常容易。 “每5秒”(每5秒执行一次操作)..或(“上午10点”)将每天上午10点采取措施。 请记住,mongo在UTC时间中设置为标准时间,因此您必须进行转换。

    if (Meteor.isServer) {
  // optionally set the collection's name that synced cron will use
  SyncedCron.config({
    collectionName: 'somethingDifferent'
  });

  SyncedCron.add({
    name: 'Crunch some important numbers for the marketing department',
    schedule: function(parser) {
      // parser is a later.parse object
      // return parser.text('every 5 seconds');

      return parser.text('at 3:00 am');
      // midnight is at 5pm LA time ... 10 am LA time is 3 am UTC
    },
    job: function(intendedAt) {
      var today = new Date();
      var yesterday = new Date()
      var dayBeforeYesterday = new Date()
      yesterday.setDate(today.getDate() - 1)
      dayBeforeYesterday.setDate(today.getDate() - 2)


      var todaysUsers = Meteor.users.find({   createdAt: {    $lt: (yesterday), $gt: dayBeforeYesterday   } }).fetch()
      //rest of function here

      }
    }
  });

  Meteor.startup(function () {
    // code to run on server at startup
    SyncedCron.start();

    // Stop jobs after 15 seconds
    // Meteor.setTimeout(function() { SyncedCron.stop(); }, 7 * 1000);
  });
}

我建议使用诸如类的软件包来实现此目的。

  相关解决方案