Javascript只调用一次具有setInterval()的子函数

时间:2012-08-02 19:42:12

标签: javascript jquery

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

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

4 个答案:

答案 0 :(得分: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);​

答案 1 :(得分: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);

}());

答案 2 :(得分:0)

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

function myFunc1(){

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


arguments.callee.done = true;    

}

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

答案 3 :(得分:-1)

setInterval返回一个值,您可以将该值传递给clearInterval以停止调用回调。

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