Ответ 1
var date = new Date();
setTimeout(function() {
setInterval(myFunction, 60000);
myFunction();
}, (60 - date.getSeconds()) * 1000);
Очевидно, что это не на 100% точно, но для большинства случаев этого должно быть достаточно.
Для энтузиастов javascript,
как бы вы запрограммировали дескриптор setTimeOut
(или setInterval
), чтобы стрелять с минуты в минуту. Так, например, если это 51 секунда текущего времени, тогда запустите его за 9 секунд, если это 14-я секунда, а затем запустите его за 46 секунд.
спасибо
var date = new Date();
setTimeout(function() {
setInterval(myFunction, 60000);
myFunction();
}, (60 - date.getSeconds()) * 1000);
Очевидно, что это не на 100% точно, но для большинства случаев этого должно быть достаточно.
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());
Во-первых, давайте удостоверимся, что мы знаем, сколько у нас есть времени до следующей минуты:
var toExactMinute = 60000 - (new Date().getTime() % 60000);
Теперь, если вы хотите работать с setTimeout
, то
setTimeout(yourfunction, toExactMinute);
Если вы хотите сделать setInterval
:
setTimeout(function() {
setInterval(yourFunction, 60000);
yourFunction();
}, toExactMinute);
var seconds = (new Date()).getSeconds();
Используйте 60-seconds
как время ожидания. Конечно, setTimeout
позволяет указать миллисекунды, что означает, что вы также должны проверять миллисекунды, но это даст вам "достаточно близко" для большинства приложений. Во всяком случае, это должно заставить вас перерегулировать минуту на какую-то долю секунды, но лучше перерегулировать, чем недомогание. Недостатки могут привести к катастрофическому сбою этого метода.
Сначала я использовал решение, предложенное Джоэлом Поттером. Его решение достаточно хорошо в большинстве случаев. Однако, поскольку 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();
var d = new Date();
var milisecondsUntilMinuteChanges = 60000 - d.getMilliseconds() - (1000 * d.getSeconds());
function waitForNewMinute() {
if (new Date().getSeconds()>1) {
setTimeout(waitForNewMinute, 500);
} else {
setInterval(doMyThing,60000);
}
}
waitForNewMinute();
Хотя слишком поздно для ответа, у меня была схожая проблема, чтобы решить недавно и подумал о совместном использовании моего подхода. Моя проблема заключалась в том, чтобы запустить таймаут через определенные секунды, основываясь на том, как далеко он находится вдали от минуты, а затем каждую минуту выполняет функцию интервала. Вот что я сделал.
Скажем, дата - это объект даты 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 - 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", и он, безусловно, выполняет то, что просил ОП - срабатывает в минуту - каждый раз!