每隔12小时设定一个间隔

时间:2017-07-25 12:03:01

标签: javascript jquery vue.js

我需要一个初始运行的功能,然后在中午12点和12点重新运行。如果有任何影响,我正在使用VueJS。

fetch_datetime()
{
    axios.get('/api/core/datetime').then((response) => {
        this.datetime = response.data;
        this.set_interval();
    });
},

set_interval()
{
    var current_date = new Date();
    var hours = current_date.getHours();
    var minutes = current_date.getMinutes();
    var seconds = current_date.getSeconds();
    if(hours == 12 && minutes == 0 && seconds == 0 || hours == 0 && minutes == 0 && seconds == 0)
    {
        this.fetch_datetime();
    } else
    {
        if(hours >= 12)
        {
            setTimeout(this.fetch_datetime, (1000 * (60 - seconds) * (60 - minutes)) + (1000 * 60 * (24 - hours - 1) * 60));
        } else
        {
            setTimeout(this.fetch_datetime, (1000 * (60 - seconds) * (60 - minutes)) + (1000 * 60 * (12 - hours - 1) * 60));
        }
    }

然而,这不能按预期工作,并且该功能会提前运行,然后在一小时内多次运行。

2 个答案:

答案 0 :(得分:1)

这是一个非常简单的功能,可以做你想要的。它应该适合您的使用案例(几分钟后刷新),但不要期望它在浏览器更改方面非常有弹性。



// Takes an array of hours as number and a function to execute
function executeOnHours(hours, callback) {
  callback(); // First, execute once
  let now = new Date();
  const hoursWithToogle = hours.map(h => {
    return {
      value: h,
      executedToday: now.getHours() === h // Don't run now if already on the given hour
    }
  });
  setInterval(() => {
    now = new Date();
    const triggers = hoursWithToogle.filter(h => {
      if (!h.executedToday && h.value === now.getHours()) {
        return h.executedToday = true;
      } else if (h.value !== now.getHours()) {
        h.executedToday = false; // Clean the boolean on the next hour
      }
    });
    if (triggers.length) callback(); // Trigger the action if some hours match
  }, 30000); // Fix a precision for the check, here 30s
}

executeOnHours([0, 12], function() {
  console.log('Something is done');
});




如果您正在寻找更强大的解决方案,您还可以使用later.js声称可以在浏览器上运行并提供全功能的cron界面,但需要支付捆绑包大小。

答案 1 :(得分:0)

我首先计算到下一个上午12点/下午的距离,在第一次运行后你可以在每次通话中增加12小时或创建一个间隔。

要获得第一次跑步的距离,您可以使用Date.now的差异和运行的时刻:

var n = new Date()
if(n.getHours()>=12){
  n.setHours(24);
}else{
  n.setHours(12);  
}

此后将所有较小的单位设置为小时为零。

初次通话后: setInterval(this.fetch_datetime, 12 * 60 * 60 * 1e3)

还有一个vue插件,可以为间隔和回调https://www.npmjs.com/package/vue-interval

提供帮助

您还应该记住,setTimeout和setInterval并不是绝对正确的。它们可能会在早期或晚期被触发几毫秒。因此,计算下一个执行时刻的差异可以触发函数加倍。