Помогите выбрать между settimeout и setinterval - PullRequest
1 голос
/ 13 июня 2011

ОБНОВЛЕНИЕ 2:

ОК, похоже, он запускается первый раз через минуту.Как заставить его работать при загрузке, затем каждую минуту после этого?

ОБНОВЛЕНИЕ 1:

Я пробовал: var interval = setInterval(get_reported_incidents, 60000);, но ничего не происходит.в get_reported_incidents(); у меня просто есть alert("hello");.

ОРИГИНАЛЬНЫЙ ВОПРОС:

Я хочу запускать функцию каждую минуту:

get_reported_incidents();

Но я не уверен, какой метод лучше всего подходит для этой задачи;

settimeout или setinterval

Ответы [ 7 ]

3 голосов
/ 13 июня 2011

Это полностью личное предпочтение. У setInterval есть некоторые странные крайние случаи вокруг того, что происходит, когда код предыдущего интервала не завершился до начала следующего интервала (не проблема, если ваш интервал равен минуте ; интервалы каждую секунду, что иногда хочется, немного хитрее).

Я обычно предпочитаю цепные setTimeout вызовы (где каждый планирует следующий), потому что они не могут убежать с вами & mdash; Ваш код всегда должен явно сказать: «Хорошо, и перезвони мне в следующий раз». Но правильно написанный код должен работать с любым из них.

Связанные вызовы setTimeout также лучше подходят для асинхронных операций, например, для опроса чего-либо через ajax, потому что вы не планируете следующий тайм-аут, пока операция ajax не завершит . Используя setInterval, поскольку вызовы ajax являются асинхронными, вы можете в конечном итоге перекрывать их.

1 голос
/ 13 июня 2011

Строго говоря, setInterval() был разработан для повторяющихся событий и setTimeout() для событий с одним выстрелом.

Однако вы, как правило, обнаружите, что с setTimeout() время будет постепенно "ползти".Я не пробовал это делать с интервалами в 1 минуту, но с 1-секундным таймером я обнаружил, что это происходит довольно часто.Часы, показывающие текущее время (с точностью до миллисекунды), будут показывать постоянное увеличение значения «сейчас» в миллисекундах.

См. http://jsfiddle.net/alnitak/LJCJU/ и настроить интервал, чтобы понять, что я имею в виду!

Итак, для большей точности я делаю это:

var timerHandler = function() {
    var interval = 60000;
    // do some stuff
    ...

    var now = new Date();
    var delay = interval - (now % interval);
    setTimeout(timerHandler, delay); 
};

Это идеально, если вы хотите, чтобы события таймера запускались синхронно с часами в вашей системе, а не в неустановленное время "примерно каждую минуту".

1 голос
/ 13 июня 2011

setinterval выполняет функцию с заданным интервалом.settimeout выполняет функцию по истечении указанного времени ожидания и затем завершается.

Если вы пытаетесь выполнять cron-подобное выполнение каждую минуту, вы захотите использовать setinterval.

Пожалуйста, смотрите http://javascript.about.com/library/blstvsi.htm для сравнения.

1 голос
/ 13 июня 2011

использовать setTimeout рекурсивно.См. здесь для получения дополнительной информации о том, почему setInterval является плохим выбором.

function timeout (){
    get_reported_incidents();
    setTimeout(timeout, 1000 * 60);
}

timeout(); // start
1 голос
/ 13 июня 2011

setTimeout запускает команду один раз через определенный промежуток времени.setInterval запускает команду каждый интервал времени.

Итак, для запуска get_reported_incidents каждую минуту используйте setInterval.

var interval = setInterval(get_reported_incidents, 60000);
1 голос
/ 13 июня 2011

Использование setinterval было бы более естественным выбором.Если вы используете setTimeout, вы должны начать новый тайм-аут из обработчика событий.

window.setInterval(get_reported_incidents, 60*1000);
0 голосов
/ 13 июня 2011

очевидно setinterval может быть проще в вашем случае

get_reported_incidents(); //first call
var interval = setInterval(get_reported_incidents, 60000);

против

var interval;
function timeout (){
    get_reported_incidents();
    interval=setTimeout(timeout, 60000);
}
timeout();
...