Вызовите функцию каждый час

Я пытаюсь обновить информацию от службы погоды на своей странице. Информация должна обновляться каждый час в час. Как именно я собираюсь вызывать функцию в час каждый час?

У меня вроде была идея, но я не уверен, как на самом деле ее доработать, чтобы она работала... То, что я имел в виду, было чем-то вроде создания оператора 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);