2012-08-02 64 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上的「完成」變量將確保該方法只執行一次。