我使用此脚本每小时检索一个页面的新内容。
(function worker() {
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
setTimeout(worker, 3600000);
}
});
})();
它每60分钟加载一次内容,但我真正想要的是在每小时开始时加载新内容(即8:00再加上9:00)。 如果我在一小时开始加载页面,我的代码是有用的,但如果我在一小时内首次加载它(例如7:45),它会在8:45重新加载内容,依此类推。我怎样才能改进我的代码,说第一次重新加载应该在15分钟后再发生每小时?如何更改setTimeout函数以实现我的目标? 我发现了一段可以接近我的目标的代码,但我仍然不知道如何将它集成到我的函数中:
function refreshAt(hours, minutes, seconds) {
var now = new Date();
var then = new Date();
if(now.getHours() > hours ||
(now.getHours() == hours && now.getMinutes() > minutes) ||
now.getHours() == hours && now.getMinutes() == minutes &&
now.getSeconds() >= seconds) {
then.setDate(now.getDate() + 1);
}
then.setHours(hours);
then.setMinutes(minutes);
then.setSeconds(seconds);
var timeout = (then.getTime() - now.getTime());
setTimeout(function() { window.location.reload(true); }, timeout);
}
答案 0 :(得分:1)
您可以计算到下一个小时的剩余毫秒数
function doNextHour(callback) {
// time now in milliseconds since 1970
var now = new Date().getTime();
var MS_IN_HOUR = 60 * 60 * 1000;
// remaining ms until next hour
var remaining = MS_IN_HOUR - (now % MS_IN_HOUR);
setTimeout(callback, remaining);
}
使用
(function worker() {
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
doNextHour(worker);
}
});
})();
确保您最初还要调用worker()
来启动cron作业
答案 1 :(得分:0)
在javascript中,您将获得当前时间的分钟数:
var date = new Date();
var minutes = date.getMinutes();
现在在您的代码中,尝试类似:
if(minutes == 0){
setTimeout(worker, 3600000);
}else{
setTimeout(worker, 3600000-minutes*1000);
}
但是如果分钟== 0,请确保第一次获取内容。
答案 2 :(得分:0)
这可能适合你
function worker() {
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
setTimeout(worker, 3600000);
}
});
}
var mins = new Date().getMinutes();
if(mins > 0){
mins = 60 - mins;
}
setTimeout(worker, mins*60*1000);
答案 3 :(得分:0)
使用小时的偏移量进行第一次超时。
setTimeout(worker,3600000 - ((new Date) % 3600000))
这有点准确(Date对象构造可能需要几毫秒)。
答案 4 :(得分:0)
如何重新计算每个循环的延迟:
(function worker() {
var next_call = 60 - new Date().getMinutes();
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
setTimeout(worker, next_call*60*1000);
}
});
})();
答案 5 :(得分:0)
我不会直接弄乱Date对象,而是使用这个库:http://momentjs.com/docs/
然后你就会有这样简单的东西,它避免编写自定义日期逻辑,并且易于阅读:
var worker = function() {
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
},
complete: function() {
setTimeout(worker, moment().endOf('hour').valueOf());
}
});
};
setTimeout(worker, moment().endOf('hour').valueOf());