我需要一个初始运行的功能,然后在中午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));
}
}
然而,这不能按预期工作,并且该功能会提前运行,然后在一小时内多次运行。
答案 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并不是绝对正确的。它们可能会在早期或晚期被触发几毫秒。因此,计算下一个执行时刻的差异可以触发函数加倍。