Хотите, чтобы функция JavaScript запускалась каждую минуту, но не более 3 раз - PullRequest
16 голосов
/ 07 августа 2009

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

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

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

Ответы [ 9 ]

41 голосов
/ 07 августа 2009

Как это:

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

    //...
}

var timerId = setInterval(timerMethod, 60000);    //60,000 milliseconds
12 голосов
/ 07 августа 2009

Решение на основе замыкания, использующее 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);

РЕДАКТИРОВАТЬ: Другой способ выразить то же самое, используя 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() линии.

4 голосов
/ 27 ноября 2012

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

var count = 0;

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

function yourFunction (){

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

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

// your code


}
4 голосов
/ 07 августа 2009

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

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 );
3 голосов
/ 10 декабря 2009

Чтобы продлить 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);
3 голосов
/ 07 августа 2009

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

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

        fn();
    }, interval);
})(yourFunction, 60000, 3);
2 голосов
/ 07 августа 2009

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

var X=setInterval(....);

Также есть глобальный счетчик

var c=0;

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

c++;
if(c>3) window.clearInterval(X);
1 голос
/ 07 августа 2009

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

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

0 голосов
/ 07 августа 2009
var testTimeInt = 3;
function testTime(){

    testTimeInt--;

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

}


setTimeOut("testTime()", 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...