SetInterval Поминутно В минуту

Для энтузиастов javascript,

как бы вы запрограммировали дескриптор setTimeOut (или setInterval), чтобы стрелять с минуты в минуту. Так, например, если это 51 секунда текущего времени, тогда запустите его за 9 секунд, если это 14-я секунда, а затем запустите его за 46 секунд.

спасибо

Ответ 1

var date = new Date();

setTimeout(function() {
    setInterval(myFunction, 60000);
    myFunction();
}, (60 - date.getSeconds()) * 1000);

Очевидно, что это не на 100% точно, но для большинства случаев этого должно быть достаточно.

Ответ 2

var nextTick = function() {
  return 60000 - (new Date().getTime() % 60000);
}, timerFunction = function() {
  // do stuff
  // do stuff
  // do stuff
  setTimeout(timerFunction, nextTick());
};
var timeout = setTimeout(timerFunction, nextTick());

Ответ 3

Во-первых, давайте удостоверимся, что мы знаем, сколько у нас есть времени до следующей минуты:

var toExactMinute = 60000 - (new Date().getTime() % 60000);

Теперь, если вы хотите работать с setTimeout, то

setTimeout(yourfunction, toExactMinute);

Если вы хотите сделать setInterval:

setTimeout(function() {
    setInterval(yourFunction, 60000);
    yourFunction();
}, toExactMinute);

Ответ 4

var seconds = (new Date()).getSeconds();

Используйте 60-seconds как время ожидания. Конечно, setTimeout позволяет указать миллисекунды, что означает, что вы также должны проверять миллисекунды, но это даст вам "достаточно близко" для большинства приложений. Во всяком случае, это должно заставить вас перерегулировать минуту на какую-то долю секунды, но лучше перерегулировать, чем недомогание. Недостатки могут привести к катастрофическому сбою этого метода.

Ответ 5

Сначала я использовал решение, предложенное Джоэлом Поттером. Его решение достаточно хорошо в большинстве случаев. Однако, поскольку javascript делает одну вещь за раз (если вы не используете Рабочих), может быть поздно с первым таймаутом, поэтому ваш первый тайм-аут выполняется, например. 5 секунд слишком поздно, и вы получаете интервал каждые 5 секунд после минуты.

Итак, вот моя реализация:

function setMyFunctionInterval()
{
    var currentDateSeconds = new Date().getSeconds();
    if (currentDateSeconds == 0) {
        setInterval(myFunction, 60000);
    }
    else {
        setTimeout(function () {
            setMyFunctionInterval();
        }, (60 - currentDateSeconds) * 1000);
    }

    myFunction();
}

setMyFunctionInterval();

Ответ 6

var d = new Date();
var milisecondsUntilMinuteChanges = 60000 - d.getMilliseconds() - (1000 * d.getSeconds());

Ответ 7

function waitForNewMinute() {
    if (new Date().getSeconds()>1) {
        setTimeout(waitForNewMinute, 500);
    } else {
        setInterval(doMyThing,60000);
    } 
}

waitForNewMinute();

Ответ 8

Хотя слишком поздно для ответа, у меня была схожая проблема, чтобы решить недавно и подумал о совместном использовании моего подхода. Моя проблема заключалась в том, чтобы запустить таймаут через определенные секунды, основываясь на том, как далеко он находится вдали от минуты, а затем каждую минуту выполняет функцию интервала. Вот что я сделал.

Скажем, дата - это объект даты javascript, созданный с помощью date = new Date();

  • Получите оставшиеся секунды, чтобы достичь минуты secondsLeft = 60 - date.getSeconds();
  • Затем установите функцию таймаута для запуска после secondsLeft, а внутри функции задайте функцию интервалов для запуска каждую минуту как:

    setTimeout(function() {
      // perform the action **A**;
      minuteMS = 60 * 1000; // seconds * milliSeconds
      setIntervalId = setInterval(function() {
      // perform the action **A**;
     }, minuteMS);
    }, secondsLeft);
    
  • Используя вышеуказанный формат/алгоритм, вы должны иметь возможность добиться аналогичных проблем, будь то секунды, предоставленные в любом формате. Идея состоит в том, чтобы получить разницу в секундах и 60, запустить тайм-аут после этих секунд и функцию интервала времени ожидания интервала с интервалом как минуту/или что-то как таковое на основе требования.

Ответ 9

Я использовал '(60 - date.getSeconds()) * 1000);' метод функции обновления данных, и, пока он работал, он "дрейфовал" со временем (на 14 секунд позже, чем я его изменил!)

Поскольку данные нужно было обновлять ПО в минуту (а этого явно не было, поскольку у нас есть часы на одной странице!), Вот решение, которое я нашел:

setInterval(function () {
    if(moment().format('ss') === "00"){
        console.log('we are at the 0 - update the data!');
        refresh_data();
    }
}, 1000);

Это, конечно, использует момент .js, чтобы найти время "0", и он, безусловно, выполняет то, что просил ОП - срабатывает в минуту - каждый раз!