Вызовите функцию каждый час
Я пытаюсь обновить информацию от службы погоды на своей странице.
Информация должна обновляться каждый час в час.
Как именно я собираюсь вызывать функцию в час каждый час?
У меня вроде была идея, но я не уверен, как на самом деле ее доработать, чтобы она работала...
То, что я имел в виду, было чем-то вроде создания оператора if, например: (псевдо-код)
//get the mins of the current time
var mins = datetime.mins();
if(mins == "00"){
function();
}
Ответы
Ответ 1
Вы хотите проверить setInterval
: https://developer.mozilla.org/en-US/docs/Web/API/Window.setInterval
Немного сложно сказать, что вы пытаетесь вызвать с помощью своего кода, но это было бы что-то в виде:
function callEveryHour() {
setInterval(yourFunction, 1000 * 60 * 60);
}
Если вы хотите его каждый час, попробуйте что-то вроде:
var nextDate = new Date();
if (nextDate.getMinutes() === 0) { // You can check for seconds here too
callEveryHour()
} else {
nextDate.setHours(d.getHours() + 1);
nextDate.setMinutes(0);
nextDate.setSeconds(0);// I wouldn't do milliseconds too ;)
var difference = nextDate - new Date();
setTimeout(callEveryHour, difference);
}
Теперь эта реализация проверяет время один раз, устанавливает задержку (или сразу вызывает функцию), а затем полагается на setInterval для отслеживания после этого. Альтернативный подход может состоять в том, чтобы опросить время каждые x много секунд/минут и вместо этого запустить его .getMinutes() == 0
(аналогично первой части if-statement), что может принести в жертву (маргинальную) производительность для (предельной) точности. В зависимости от ваших конкретных потребностей я бы играл с обоими решениями.
Ответ 2
Рабочий пример:
http://jsfiddle.net/mgX6e/
function tick()
{
//get the mins of the current time
var mins = new Date().getMinutes();
if(mins == "00"){
alert('Do stuff');
}
console.log('Tick ' + mins);
}
setInterval(tick, 1000);
Ответ 3
Что вы, вероятно, хотите, это что-то вроде этого:
var now = new Date();
var delay = 60 * 60 * 1000; // 1 hour in msec
var start = delay - (now.getMinutes() * 60 + now.getSeconds()) * 1000 + now.getMilliseconds();
setTimeout(function doSomething() {
// do the operation
// ... your code here...
// schedule the next tick
setTimeout(doSomething, delay);
}, start);
Итак, в первый раз, когда пользователь получает доступ, вам нужно знать, что задержка в миллисекундах до следующего "часа". Таким образом, если пользователь получает доступ к странице в 8:54 (с 56 секундами и 123 миллисекундами), вам нужно запланировать первое исполнение примерно через 3 минуты: после того, как первый будет выполнен, вы можете называть его каждый "час" ( 60 * 60 * 1000).
Ответ 4
EDIT: Ой, я не видел вещи "o", поэтому я отредактировал свой ответ:
var last_execution = new Date().getTime();
function doSomething(force){
var current_time = new Date().getTime();
if (force || (current_time.getMinutes() == 0)
{
last_execution = current_time;
// something
// ...
}
setTimeout(doSomething(false), 1000);
}
// force the first time
doSomething(true);