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

时间:2015-07-19 21:03:13

标签: javascript meteor cron setinterval

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

我找到了许多可以做到的方法。似乎setInterval()可以是一种方法。

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

例如,上述情况会在每天上午10点触发。

我还发现有一个运行cron作业的包。 https://github.com/percolatestudio/meteor-synced-cron

似乎我可以设置一个cron作业来每天发送电子邮件。我从未使用过cron工作,所以我觉得这个选项对我来说要困难得多。

最后,我也发现了这种方式: Call function once on day change

只需一个常规功能。

似乎也许setTimeout()是完成它的最简单方法。但是有任何挫折吗?我不想错过电子邮件,或者多次错过电子邮件用户。我的网站是现场和成长,所以我不想找出困难的方法。

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

我认为您必须使用Meteor.setInterval()而不是setInterval()才能使其在服务器上正常运行。但是,我使用它来运行每个 second 所需的函数;对于更长的时期,任何类型的cron作业包也可以正常工作,例如synced-cron

答案 1 :(得分:1)

所以,完成主题并可能帮助处于相同情况的任何人。这就是我做到的。我添加了包'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);
  });
}

答案 2 :(得分:0)

我建议使用percolate:synced-cron之类的包来实现这一目标。