Ответ 1
Вот так:
var runCount = 0;
function timerMethod() {
runCount++;
if(runCount > 3) clearInterval(timerId);
//...
}
var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds
У меня есть javascript-метод ajax, который извлекает данные со страницы и т.д.
Я хочу, чтобы этот процесс выполнялся на временной интервал, скажем, каждую минуту. Но я не хочу, чтобы он зацикливался навсегда, так что максимум в 3 раза.
Каков наилучший способ реализовать это?
Вот так:
var runCount = 0;
function timerMethod() {
runCount++;
if(runCount > 3) clearInterval(timerId);
//...
}
var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds
Решение, основанное на закрытии, с использованием setInterval()
и clearInterval()
:
// define a generic repeater
var repeater = function(func, times, interval) {
var ID = window.setInterval( function(times) {
return function() {
if (--times <= 0) window.clearInterval(ID);
func();
}
}(times), interval);
};
// call the repeater with a function as the argument
repeater(function() {
alert("stuff happens!");
}, 3, 60000);
EDIT: Другой способ выразить то же самое, используя setTimeout()
вместо:
var repeater = function(func, times, interval) {
window.setTimeout( function(times) {
return function() {
if (--times > 0) window.setTimeout(arguments.callee, interval);
func();
}
}(times), interval);
};
repeater(function() {
alert("stuff happens!");
}, 3, 2000);
Может быть, последнее немного легче понять.
В версии setTimeout()
вы можете убедиться, что следующая итерация произойдет только после того, как предыдущий закончен. Вы просто перемещаете строку func()
над строкой setTimeout()
.
Многоразовый подход
function setMaxExeuctionInterval( callback, delay, maxExecutions )
{
var intervalCallback = function()
{
var self = intervalCallback;
if ( 'undefined' == typeof self.executedIntervals )
{
self.executedIntervals = 1;
}
if ( self.executedIntervals == maxExecutions )
{
clearInterval( self.interval )
}
self.executedIntervals += 1;
callback();
};
intervalCallback.interval = setInterval( intervalCallback, delay );
}
// console.log requires Firebug
setMaxExeuctionInterval( function(){ console.log( 'hi' );}, 700, 3 );
setMaxExeuctionInterval( function(){ console.log( 'bye' );}, 200, 8 );
вы можете сделать с помощью setInterval
var count = 0;
var interval = setInterval(yourFunction(), 1000);
function yourFunction (){
clearInterval(interval);
if(count < 3){
count ++;
interval = setInterval(yourFunction(), 1000);
}
// your code
}
Эта анонимная функция (она не вводит никаких новых глобалов) будет делать то, что вам нужно. Все, что вам нужно сделать, это заменить yourFunction
на вашу функцию.
(function(fn, interval, maxIterations) {
var iterations = 0,
id = setInterval(function() {
if (++iterations > maxIterations)
return clearInterval(id);
fn();
}, interval);
})(yourFunction, 60000, 3);
Чтобы расширить функцию Tomalak:
Если вы хотите узнать, сколько осталось циклов:
var repeater = function(func, times, interval) {
window.setTimeout( function(times) {
return function() {
if (--times > 0) window.setTimeout(arguments.callee, interval);
func(times);
}
}(times), interval);
}
и используйте:
repeater(function(left){
//... (do you stuff here) ...
if(left == 0) {
alert("I'm done");
}
}, 3, 60000);
Используйте setInterval, обязательно получите ссылку.
var X=setInterval(....);
Кроме того, у вас есть глобальный счетчик
var c=0;
Внутри функции, вызываемой setIntervale, выполните:
c++;
if(c>3) window.clearInterval(X);
Вы можете использовать setInterval(), а затем внутри вызываемой функции учитывайте, сколько раз вы запускали функцию, а затем clearInterval().
Или вы можете использовать setTimeout(), а затем внутри вызываемой функции call setTimeout() снова, пока вы не сделали это 3 раза.
var testTimeInt = 3;
function testTime(){
testTimeInt--;
if(testTimeInt>0)
setTimeOut("testTime()", 1000);
}
setTimeOut("testTime()", 1000);