【问题标题】:Meteor: Using setInterval() To Run Function Once Per DayMeteor:使用 setInterval() 每天运行一次函数
【发布时间】:2015-07-19 21:03:13
【问题描述】:

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

我正在寻找许多可以完成的方法。似乎 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() 是完成它的最简单方法。但是有什么挫折吗?我不想错过电子邮件,或者多次错过电子邮件用户。我的网站正在运行并且正在增长,所以我不想找出困难的方法。

感谢任何帮助。

【问题讨论】:

    标签: javascript meteor cron setinterval


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我已经在研究 synched-cron,实现起来似乎没有那么复杂
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        相关资源
        最近更新 更多