Подтвердить что ты не робот

Хотите, чтобы функция javascript запускалась каждую минуту, но не более 3 раз

У меня есть javascript-метод ajax, который извлекает данные со страницы и т.д.

Я хочу, чтобы этот процесс выполнялся на временной интервал, скажем, каждую минуту. Но я не хочу, чтобы он зацикливался навсегда, так что максимум в 3 раза.

Каков наилучший способ реализовать это?

4b9b3361

Ответ 1

Вот так:

var runCount = 0;    
function timerMethod() {
    runCount++;
    if(runCount > 3) clearInterval(timerId);

    //...
}

var timerId = setInterval(timerMethod, 60000);    //60,000 milliseconds

Ответ 2

Решение, основанное на закрытии, с использованием 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().

Ответ 3

Многоразовый подход

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 );

Ответ 4

вы можете сделать с помощью setInterval

var count = 0;

var interval = setInterval(yourFunction(), 1000);

function yourFunction (){

  clearInterval(interval);  
  if(count < 3){

    count ++;
    interval = setInterval(yourFunction(), 1000);
  }

// your code


}

Ответ 5

Эта анонимная функция (она не вводит никаких новых глобалов) будет делать то, что вам нужно. Все, что вам нужно сделать, это заменить yourFunction на вашу функцию.

(function(fn, interval, maxIterations) {
    var iterations = 0,
    id = setInterval(function() {
        if (++iterations > maxIterations)
            return clearInterval(id);

        fn();
    }, interval);
})(yourFunction, 60000, 3);

Ответ 6

Чтобы расширить функцию 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);

Ответ 7

Используйте setInterval, обязательно получите ссылку.

var X=setInterval(....);

Кроме того, у вас есть глобальный счетчик

var c=0;

Внутри функции, вызываемой setIntervale, выполните:

c++;
if(c>3) window.clearInterval(X);

Ответ 8

Вы можете использовать setInterval(), а затем внутри вызываемой функции учитывайте, сколько раз вы запускали функцию, а затем clearInterval().

Или вы можете использовать setTimeout(), а затем внутри вызываемой функции call setTimeout() снова, пока вы не сделали это 3 раза.

Ответ 9

var testTimeInt = 3;
function testTime(){

    testTimeInt--;

    if(testTimeInt>0)
       setTimeOut("testTime()", 1000);

}


setTimeOut("testTime()", 1000);