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

Это должно добиться цели:

echo `pwd`/`dirname $0`

Это могло бы выглядеть ужасным в зависимости от того, как это было вызвано и cwd, но должно получить Вас, куда необходимо пойти (или можно настроить строку, если Вы заботитесь, как это смотрит).

16
задан mrblah 7 August 2009 в 16:00
поделиться

8 ответов

Вот так:

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

    //...
}

var timerId = setInterval(timerMethod, 60000);    //60,000 milliseconds
41
ответ дан 30 November 2019 в 15:10
поделиться

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

12
ответ дан 30 November 2019 в 15:10
поделиться

Подход многократного использования

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
ответ дан 30 November 2019 в 15:10
поделиться

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

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

        fn();
    }, interval);
})(yourFunction, 60000, 3);
3
ответ дан 30 November 2019 в 15:10
поделиться

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

var X=setInterval(....);

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

var c=0;

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

c++;
if(c>3) window.clearInterval(X);
2
ответ дан 30 November 2019 в 15:10
поделиться

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

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

1
ответ дан 30 November 2019 в 15:10
поделиться
var testTimeInt = 3;
function testTime(){

    testTimeInt--;

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

}


setTimeOut("testTime()", 1000);
0
ответ дан 30 November 2019 в 15:10
поделиться

Чтобы расширить функцию Томалак :

Если вы хотите узнать, сколько циклов осталось:

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
ответ дан 30 November 2019 в 15:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: