javascript — рекурсивная функция и setTimeout

Я пытаюсь написать функцию javascript, которая при вызове выполняет функцию DoSomething() один раз, но может быть запущена для многократного выполнения функции до тех пор, пока не будет остановлена.

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

<!DOCTYPE html>
<html>
    <script src="jquery.js"></script>

    <script>
    var globalCheckInventory = false;

    $(document).ready(function(){
        // start checking inventory
        globalCheckInventory = true;                 
        myTimerFunction();  
    }); 

    // check inventory at regular intervals, until condition is met in DoSomething
    function myTimerFunction(){
        DoSomething();
        if (globalCheckInventory == true)
        {
            setTimeout(myTimerFunction, 5000);      
        }           
    }

    // when condition is met stop checking inventory
    function DoSomething() {     
        alert("got here 1 ");
        var condition = 1;
        var state = 2 ;
        if (condition == state)
        {
            globalCheckInventory = false;
        }        
    }
    </script>

person mustapha george    schedule 30.08.2011    source источник


Ответы (4)


Это, вероятно, более простой способ сделать то, что вы описываете:

$(function () {
  var myChecker = setInterval(function () {
    if (breakCondition) {
      clearInterval(myChecker);
    } else {
      doSomething();
    }
  }, 500);
});
person g.d.d.c    schedule 30.08.2011

Другой способ сделать это - сохранить идентификатор таймера и использовать setInterval и clearInterval.

var timer = setInterval(DoSomething);

function DoSomething() {
    if (condition)
        clearInterval(timer);
}
person Alex Turpin    schedule 30.08.2011

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

(function(){

  var checkInventory = false, inventoryTimer;

  function myTimerFunction() { /* ... */ }

  function doSomething() { /* ... */ }

  $(document).ready(function(){
    checkInventory = true;
    /* save handle to timer so you can cancel or reset the timer if necessary */
    inventoryTimer = setTimeout(myTimerFunction, 5000);
  });

})();
person sholsinger    schedule 30.08.2011

Инкапсулируйте это:

function caller(delegate, persist){
    delegate();
    if(persist){
        var timer = setInterval(delegate, 300);
        return {
            kill: function(){
                clearInterval(timer);
            }
        } 
    }   
}
var foo = function(){
    console.log('foo');
}

var _caller = caller(foo, true);
//to stop: _caller.kill()
person Geoff Moller    schedule 30.08.2011