setInterval По минутам По минутам - PullRequest
10 голосов
/ 05 апреля 2010

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

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

спасибо

Ответы [ 8 ]

17 голосов
/ 05 апреля 2010
var date = new Date();

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

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

6 голосов
/ 05 апреля 2010
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 голосов
/ 26 октября 2017

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

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

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

setTimeout(yourfunction, toExactMinute);

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

setTimeout(function() {
    setInterval(yourFunction, 60000);
    yourFunction();
}, toExactMinute);
1 голос
/ 01 февраля 2013

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

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

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

    myFunction();
}

setMyFunctionInterval();
1 голос
/ 05 апреля 2010
var seconds = (new Date()).getSeconds();

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

0 голосов
/ 10 апреля 2017

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

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

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

    setTimeout(function() {
      // perform the action **A**;
      minuteMS = 60 * 1000; // seconds * milliSeconds
      setIntervalId = setInterval(function() {
      // perform the action **A**;
     }, minuteMS);
    }, secondsLeft);
    
  3. Используя вышеприведенный формат / алгоритм, вы сможете решить аналогичные проблемы за секунды, предоставленные в любом формате. Идея состоит в том, чтобы получить разницу секунд и 60, запустить тайм-аут после этих секунд, а внутри функции тайм-аута запустить функцию интервала с интервалом в минутах / или чем-либо в этом роде в зависимости от требования.
0 голосов
/ 05 апреля 2010
function waitForNewMinute() {
    if (new Date().getSeconds()>1) {
        setTimeout(waitForNewMinute, 500);
    } else {
        setInterval(doMyThing,60000);
    } 
}

waitForNewMinute();
0 голосов
/ 05 апреля 2010
var d = new Date();
var milisecondsUntilMinuteChanges = 60000 - d.getMilliseconds() - (1000 * d.getSeconds());
...