Estoy tratando de escribir una función de JavaScript que, cuando se llama, realiza la función DoSomething () una vez, pero se puede activar para realizar la función repetidamente hasta que se detenga.

Estoy usando la función setTimeout (). No estoy seguro de si este es el mejor método desde el punto de vista del rendimiento y la memoria. También me gustaría evitar la variable global si es posible

<!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>
4
mustapha george 30 ago. 2011 a las 20:21

4 respuestas

La mejor respuesta

Esta es probablemente la forma más fácil de hacer lo que estás describiendo:

$(function () {
  var myChecker = setInterval(function () {
    if (breakCondition) {
      clearInterval(myChecker);
    } else {
      doSomething();
    }
  }, 500);
});
3
g.d.d.c 30 ago. 2011 a las 16:26

No veo nada de malo en su implementación que no sea la contaminación del espacio de nombres global. Puede usar un cierre (función de ejecución automática) para limitar el alcance de sus variables de esta manera:

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

})();
0
sholsinger 30 ago. 2011 a las 16:32

Encapsularlo:

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()
0
Christopher Chiche 18 nov. 2014 a las 13:39

Otra forma de hacerlo sería almacenar la ID del temporizador y usar setInterval y clearInterval

var timer = setInterval(DoSomething);

function DoSomething() {
    if (condition)
        clearInterval(timer);
}
1
Alex Turpin 30 ago. 2011 a las 16:24