2011-08-30 127 views
4

我想寫一個JavaScript函數,當被調用時執行函數DoSomething()一次, 但可以觸發執行該功能,直到觸發停止。JavaScript的遞歸函數&setTimeout

我正在使用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> 

回答

3

這可能是做的更簡單的方法你在描述什麼:

$(function() { 
    var myChecker = setInterval(function() { 
    if (breakCondition) { 
     clearInterval(myChecker); 
    } else { 
     doSomething(); 
    } 
    }, 500); 
}); 
1

另一種方式來做到這將是商店的計時器ID和使用setIntervalclearInterval

var timer = setInterval(DoSomething); 

function DoSomething() { 
    if (condition) 
     clearInterval(timer); 
} 
0

我覺得你的實現沒有什麼錯,除了全局命名空間的污染之外。您可以使用閉合(自動執行功能)來限制你的變量是這樣的範圍:

(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

封裝它:

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