2012-08-02 59 views
0

我只想用setInterval调用myfun1一次。我想避免使用全局变量。阅读this但它不起作用(只是每2000毫秒调用一次函数)。当然,我需要每2000毫秒调用一次main()。使用setInterval()只调用一次儿童函数

(function($){   
    setinterval(main,2000); 

    function main(){    
     if(/*condition*/) return; 

     function callItOnce(fn) { 
      var called = false; 
      return function() { 
       if (!called) { 
        called = true; 
        return fn(); 
       } 
       return; 
      } 
     } 

     myfun1 = callITOnce(myfun1); 
     myfun1(); 

     function myfun1(){/*code*/}; 
     function myfun2(){/*code*/}; 
     function myfun3(){/*code*/}; 
})(jquery); 
+0

您定义了函数'callItOnce',然后使用函数'callOnce'。 – zzzzBov 2012-08-02 19:45:01

+1

如果你只想调用一次,为什么你使用'setInterval'? – 2012-08-02 19:45:23

+0

因为我正在动态检查其他东西,所以需要这种方式。 – jacktrades 2012-08-02 19:47:26

回答

5

使用标志:

(function($){ 
    var timer = setInterval(main,2000), ran=true; 

    function main() { 
     if(/*condition*/) return; 

     if (ran) { //runs when ran=true, which is only the first time 
      myfun1(); 
      ran = false; //since it's set to false here 
     } 

     function myfun1(){/*code*/}; 
     function myfun2(){/*code*/}; 
     function myfun3(){/*code*/}; 

})(jquery);​ 
+0

它看起来像OP试图在'main'函数内执行多个函数。我有同样的初步膝盖反应,但我不认为这一定是正确的答案。 – zzzzBov 2012-08-02 19:47:19

+0

回答对我没有用 – jacktrades 2012-08-02 19:48:27

+0

@adeno:除了调用myfun1这个OP只需要执行一次的操作外,OP想要一直执行'main'内的所有其他操作。 – Nope 2012-08-02 19:49:58

-1

的setInterval返回可以传递给clearInterval从被称为阻止回调的值。

var i = 0; 
var timeout_id = setTimeout(function(){ 
    console.log(i); 
    if(i >= 5){ clearTimeout(timeout_id) } 
    i++; 
}) 
+0

这是另一种选择,但我只想调用一次myFun1(),其他人则调用间隔。 .. – jacktrades 2012-08-02 19:49:45

+1

@missingno:这将完全停止回调。 OP似乎想要回调继续,但不是多次执行里面的'func1'。 – Nope 2012-08-02 19:51:23

0

你写的callItOnce函数应该可以工作。您只需要在setInterval调用之外声明该函数。否则每次都会重新定义它。

(function() { 

function myfun1(){/*code*/}; 
function myfun2(){/*code*/}; 
function myfun3(){/*code*/}; 

function callItOnce(fn) { 
    var called = false; 
    return function() { 
     if (!called) { 
      called = true; 
      return fn(); 
     } 
     return; 
    } 
} 

myfun1 = callItOnce(myfun1); 

function main() { 
    if(/*condition*/) return; 
    myfun1(); 
} 

setInterval(main, 2000); 

}()); 
0

解决此问题的一个简单方法是在函数本身上使用一个变量。

function myFunc1(){ 

if(arguments.callee.done){return;} 


arguments.callee.done = true;  

} 

这样,方法myFunc1上的“完成”变量将确保该方法只执行一次。